首先,我使用以下方法添加了加速器数据:
UIAccelerometer *theAccelerometer = [UIAccelerometer sharedAccelerometer];
theAccelerometer.updateInterval = 0.1; //in seconds
theAccelerometer.delegate = self;
注意时间是 0.1 秒。您需要将该时间与下面的动画相匹配。accelerometer:didAccelerate:
然后我在委托调用中设置动画:
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
NSInteger newX = 0;
newX = imageView.frame.size.width/2 + ((320-imageView.frame.size.width) * (acceleration.x+1)/2.0);
[UIView animateWithDuration:0.1 animations:^{
imageView.center = CGPointMake(newX, imageView.center.y);
}] ;
}
将动画持续时间与 匹配很重要,updateInterval
这样UIAccelerometer
您就可以确保在下一次更新之前完成动画。
这里的重要部分可能是确定newX
位置的数学。我基本上取了图像宽度的一半,因为那是最左边的绝对位置。从那里我知道我有320-imageView.frame.size.width
足够的空间可以添加。如果我添加整个320-imageView.frame.size.width
,那么我将在320-imageView.frame.size.width/2
最右边的位置。从那里我只需要320-imageView.frame.size.width
根据我们加速的程度来分解块。accelerator.x
数据在 -1 到 1 的范围内,所以我的整个范围是 2。所以我在 0 到 2 的范围内加了1 accelerator.x
。然后我除以 2.0,这样我就有一个 0-1 的范围。现在我有了一个乘数,我可以乘以我的320-imageView.frame.size.width
范围。如果它是 0,我会在最左边的位置。如果它是 1,我会在最右边的位置,中间的任何东西都会被线性分解。所以最后一个词是:
imageView.frame.size.width/2 + ((320-imageView.frame.size.width) * (acceleration.x+1)/2.0);
获取图像的新 x 位置。
我希望这就是你要找的!我在设备上对其进行了测试,只要您匹配持续时间,它就非常流畅。