UIImageView旋转影响位置?

时间:2013-01-11 00:19:31

标签: iphone objective-c uiimageview accelerometer uiaccelerometer

我有一个UIImageView设置为使用加速度计的值在屏幕上上下移动,使用以下代码:

ship.center = CGPointMake(ship.center.x, ship.center.y+shipPosition.y);

其中shipPosition是在accelerometerDidAccelerate方法中设置的CGPoint使用:

shipPosition.y = acceleration.x*60;

显然这很好用,很简单。当我尝试同样简单的东西时,我遇到麻烦,根据加速度改变图像的旋转。我是这样做的:

ship.transform = CGAffineTransformMakeRotation(shipPosition.y);

由于某种原因,这会导致一个非常奇怪的事情发生,因为每次调用main方法时图像都会回溯到它的原点。我可以看到图像移动到应该的位置的帧,但然后立即快速恢复。

这个问题只发生在我有旋转线,注释掉它工作正常。我不知道这里发生了什么,我已经为不同的应用做了很多次,我从来没有遇到过这样的问题。事实上,我从我创建的其他应用程序中复制了我的代码,它可以正常工作。

修改

真正让我感到困惑的是当我使用以下方法将旋转角度从加速度更改为船舶位置时:

ship.transform = CGAffineTransformMakeRotation(ship.center.y/10);

当我这样做时,船实际上是根据加速度计旋转但不移动,这很疯狂,因为改变ship.center.y意味着船的位置正在改变,但它不是!!

2 个答案:

答案 0 :(得分:1)

在设置中心坐标或框架之前,应该将视图的变换设置回CGAffineTransformIdentity,之后应用新的变换。

frame属性返回视图的变换坐标(如果它被变换)而不是 true (实际上变换为真)坐标。

来自docs

的引用
  

警告:如果transform属性不是identity变换,则此属性的值是未定义的,因此应该被忽略。


更新/实际答案:
那么实际问题是

shipPosition.y = acceleration.x*60;

因为您在accelerometerDidAccelerate中设置了y pos acceleration将不记得它的旧值。因此,如果您移动设备,它将达到峰值,当您减速时,它将再次减速。

您的船只将以最高加速度+/- 60,但当您停止移动设备时将为0,shipPosition.y将为0。

答案 1 :(得分:0)

CGAffineTransformMakeRotation需要以弧度为单位的角度,而不是度数。

1弧度= M_PI / 180.0度