我正在创建一个应用程序,其中一个对象需要在AutoRotation期间不显示移动或旋转,但其他所有内容都需要旋转并重新定位。我这样做的方法是手动旋转物体,并将其移动到相对于装置的相同位置,即旋转前的位置。问题是它看起来很有趣,似乎旋转到它以前的相同位置。
如果我在旋转过程中抑制动画效果,那么对象似乎永远不会移动,其他所有东西都会被捕捉到位,这就是我想要的。我无法在文档中找到任何告诉我如何执行此操作的内容。我该怎么做?
答案 0 :(得分:1)
当谈到UIViewController旋转时,有两种方法可以设置,这样你就有机会旋转并移动自己的视图。
在一步过程中,在您的UIViewController派生类中提供willAnimateRotationToInterfaceOrientation
的实现。它被调用,你可以开始你的对象旋转,所以当系统旋转所有其他对象正在反向旋转,所以看起来它保持不变。您需要根据当前界面方向与新方向计算反向旋转的数量和方向。
另一种方法是通知两个步骤进行自定义轮换。例如,在上半部分中,您可以缩小对象,移动它,然后将其部分旋转,然后在后半部分完成旋转,同时缩小到正常尺寸。这是一种非常聪明的方法,可以使旋转动画看起来更加流畅。
对于两步过程,您需要定义两个方法。 willAnimateFirstHalfOfRotationToInterfaceOrientation
在旋转的前半部分被调用(即,对于90度旋转,高达45度,对于倒置翻转,高度为90度)。一旦超过该点,后半部分将通过willAnimateSecondHalfOfRotationFromInterfaceOrientation
进行调用。
如果您的对象具有1:1的宽高比(即正方形或圆形)并且在视图的中间,那么一步过程可能会正常工作。但是如果它是一个非方形物体并且必须移动位置(例如,如果它在位置40,60在纵向但移动到20,100在风景中)甚至可能需要一些缩放看起来更好然后你可能想要尝试两步过程,看看它是否看起来更顺畅。
如果您的对象位于其自己的个体UIView中,那么通过UIView动画安排旋转非常容易。只需通过CGAffineTransformMakeRotation
创建转换,然后在一对UIView beginAnimations
/ commitAnimations
块中将视图的transform
属性设置为此值。您可以通过setAnimationDuration
调整时间。
编辑:根据评论,我添加了一些代码来展示如何将视图附加到顶级窗口而不是视图控制器。然后,您的对象将驻留在此视图中,而不是由控制器管理的对象(正在旋转)。您仍然需要覆盖UIViewController旋转方法,但不是在视图控制器的控制下旋转对象,而是在顶层的对象中触发反向旋转。
将视图添加到顶级窗口:
YourAppDelegate* windowDelegate = ((YourAppDelegate*) [UIApplication sharedApplication].delegate);
[windowDelegate.window addSubview:yourView];
在你可以到达的某个地方保持对yourView
的引用,然后在UIViewController的willAnimateRotationToInterfaceOrientation
中反向旋转你的视图,即计算将视图反向旋转多少到你要去的地方 - 如果手机顺时针旋转90度,您需要将视图逆时针旋转90度等,然后在yourView
上使用UIView动画。
答案 1 :(得分:0)
如果您不想要旋转动画,请在UIViewController中重载-shouldAutorotateToInterfaceOrientation:
并返回NO
。然后,您可以观察UIDeviceOrientationDidChangeNotification
以接收手动方向更改通知。
答案 2 :(得分:0)
这可能有效:
未经测试,但我知道这对某些情况有用。