2

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

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

在 accelerometerDidAccelerate 方法中设置的 CGPoint 在哪里shipPosition使用:

shipPosition.y = acceleration.x*60;

显然这很好用,非常简单。当我尝试做同样简单的事情时遇到了麻烦,根据图像的加速度改变图像的旋转。我这样做使用:

ship.transform = CGAffineTransformMakeRotation(shipPosition.y);

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

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

编辑:

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

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

当我这样做时,船实际上根据加速度计旋转但没有移动,这很疯狂,因为改变ship.center.y意味着船的位置在改变,但事实并非如此!

4

2 回答 2

1

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

如果视图被转换,则该frame属性返回转换后的坐标,而不是真实的(实际上转换后的也是真实的)坐标。

文档中引用:

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


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

shipPosition.y = acceleration.x*60;

由于您将 y 位置设置为accelerometerDidAccelerate. 不会记住它的旧值
acceleration所以如果你移动你的设备,它会达到一个峰值,当你放慢速度时,它会再次减速。

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

于 2013-01-11T10:55:11.393 回答
0

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

1 弧度 = M_PI / 180.0 度

于 2013-01-11T04:24:49.817 回答