2012-07-17 113 views
0

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

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

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

有什么想法?我已经设法通过动画来移动它,但如果我长时间倾斜,我不希望它继续移动。

+0

所以你有加速器数据,只是想弄清楚如何获得一个平滑的动画的倾斜?还是你想弄清楚加速器数据呢? – 2012-07-17 19:07:26

+0

那是正确的,我知道如何动画,我有倾斜角度。即时通讯尝试让UIImageView移动到左侧或右侧,取决于设备的倾斜度。 im gueing我必须将运动边界划分为一个百分比,然后根据它的倾斜程度取决于运动的百分比。 – Spriggsy 2012-07-17 20:02:18

+0

这就是我会做的。每当倾斜度发生显着变化时,只需使用动画更新图像中心。如果到那时你还没有发现任何问题,我会在回家时写一个答案。 – 2012-07-17 20:15:51

回答

2

首先,我使用添加的加速器数据。您需要将该时机与下面的动画进行匹配。然后,我设置了动画在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); 
    }] ; 
} 

它以匹配UIAccelerometer这样的updateInterval动画持续时间是重要的,你要确保未来的更新来通过前完成动画。

这里的重要部分可能是确定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.所以我加了1到accelerator.x从0-2归一化。然后我除以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位置。

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

+0

非常感谢,您的代码工作完美。对此,我真的非常感激 – Spriggsy 2012-07-19 13:46:23

0

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

UIAccelerometer *theAccelerometer = [UIAccelerometer sharedAccelerometer]; 
theAccelerometer.updateInterval = 0.1; //in seconds 
theAccelerometer.delegate = self; 

通知的定时为0.1秒时:

imageFrame.origin.y = 200; 

[UIView animateWithDuration:0.5 
         delay:0.0 
        options: UIViewAnimationCurveEaseOut 
       animations:^{ 
        datePickerView.frame = imageFrame; 
       } 
       completion:^(BOOL finished){ 
        self.datePickerViewFlag = YES; 
       }];