0

我目前正在创建一个 iPhone 应用程序,它显示我的速度航向位置和一些其他传感器读数,以供我的自行车使用。我已经设法从加速器获得倾斜读数。我要做的是根据倾斜读数向左或向右移动图像。

    _______________________________
    :          ===                :
    :          = =                :
    :          ===                :
    -------------------------------

假设 = 符号是我的图像,我试图让它根据倾斜角度向左边缘或右边缘移动。

有任何想法吗?我已经设法通过动画移动它,但如果我长时间倾斜,我不希望它连续移动。

4

2 回答 2

2

首先,我使用以下方法添加了加速器数据:

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 位置。

我希望这就是你要找的!我在设备上对其进行了测试,只要您匹配持续时间,它就非常流畅。

于 2012-07-18T13:32:54.633 回答
0

如果你问的是关于动画的问题。这是苹果推荐的用于动画 UIView 的代码。您可以更改 x 和 y 坐标的值。

    imageFrame.origin.y = 200;

[UIView animateWithDuration:0.5
                      delay:0.0
                    options: UIViewAnimationCurveEaseOut
                 animations:^{
                     datePickerView.frame = imageFrame;
                 } 
                 completion:^(BOOL finished){
                     self.datePickerViewFlag = YES;
                 }];
于 2012-07-17T19:01:03.240 回答