iphone - 子视图旋转问题

时间:2010-12-01 12:35:41

标签: iphone uiview rotation

我有一个UIView根和一个UIView A作为其子视图

我不允许root被旋转,所以我在root类中写

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return NO;}

但我允许根的子视图(A)被旋转,所以在A类中,我写

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;}

但似乎root及其子视图A都无法旋转。

我应该如何允许A旋转而不是根?

感谢

1 个答案:

答案 0 :(得分:3)

视图不响应shouldAutorotateToInterfaceOrientation,视图控制器可以。如果视图控制器表示它将旋转,则其视图和所有子视图将旋转。如果您的视图控制器说它不会旋转,那么它的视图将不会旋转,它的子视图也不会旋转。

根据您想要做的事情,有两种方法可以解决您的问题:

  • 如果非旋转视图位于旋转的所有内容之后,您可以将其从视图控制器中删除,并将其添加到viewWillAppear上的视图控制器后面的主应用程序窗口中:并在viewDidDisappear上再次删除它:
  • 如果非旋转和旋转视图需要以更复杂的方式混合,则可以捕获willAnimateRotationToInterfaceOrientation:duration:并在非旋转视图上设置合适的逆变换。所以它旋转然后不旋转。由于CoreAnimation的工作方式,你需要在某些180度旋转之间获得正确的行为有点棘手。

UIApplication提供了一种将关键窗口作为UIWindow对象的方法,这可能是您想要的第一个想法。 UIWindow继承自UIView,因此所有用于添加和排列子视图的标准机制都适用。

对于后者,您需要在相关视图上设置变换。从superview获取变换,得到反转并在视图上设置它。有关详细信息,请参阅CGAffineTransform。 CoreAnimation问题提到,通过最短路径(如CoreAnimation将采用)从一个旋转到一个180度的过渡给出了两个可能的解决方案 - 一个顺时针,一个逆时针。实际上,在纵向模式下,您需要为视图的变换添加不可见的偏差,以确保如果您在纵向和纵向之间上下颠倒,CoreAnimation会选择正确的偏移。如果您使用iPhone,那么不支持该设备上的UIInterfaceOrientationPortraitUpsideDown(大多数Apple应用程序都不支持)是完全可以接受的,因此实际上可能更容易不支持该方向。