在边界内倾斜移动图像

时间:2012-07-17 18:29:35

标签: iphone ios xcode4.2

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

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

让我们说=符号是我的图像,我试图让它向左边或右边移动,具体取决于倾斜角度。

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

2 个答案:

答案 0 :(得分: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的{​​{1}}相匹配非常重要,这样您才能确保在下次更新完成之前完成动画。

这里的重要部分可能是确定UIAccelerometer位置的数学。我基本上占据了图像宽度的一半,因为这是最左边的绝对位置。从那里我知道我有一个newX的空间,我可以添加。如果我添加了整个320-imageView.frame.size.width,那么我将位于320-imageView.frame.size.width这是最右边的位置。从那里我只需要根据我们加速的程度来分​​解320-imageView.frame.size.width/2块。 320-imageView.frame.size.width数据的范围是-1到1,所以我的整个范围是2.所以我在accelerator.x中添加了1以将其从0-2标准化。然后我除以2.0,这样我的范围从0到1。现在我有一个乘数,我可以将accelerator.x范围乘以。如果它是0我会在最左边的位置。如果是1,我将处于最右边的位置,中间的任何东西都将被线性地分解。所以最后一个词是:

320-imageView.frame.size.width

获取图像的新x位置。

我希望这就是你要找的!我在一台设备上对它进行了测试,只要你匹配你的持续时间,它就会很顺利。

答案 1 :(得分: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;
                 }];