在iOS 7中处理界面旋转

5

这是一个非常简单的问题,但由于存在许多互相矛盾的观点,我完全找不到一个明确的答案,更不用说现代的答案了。

我在UIViewController中处理99%的用户从纵向模式切换到横向模式或反之亦然时使用自动布局。效果很好。但有时,我仍然需要依靠框架来处理某些事情。

我该如何最好地处理呢?

您可以使用willAnimateRotationToInterfaceOrientationwillRotateToInterfaceOrientation和带有检查状态栏的NSNotification方法等方法。我相信还有其他一些方法。

如果我想在用户旋转时更改视图的位置,应该在哪个方法中更改视图的框架?最好使用简单的setFrame:还是应该使用自动调整大小的掩码?


如果您知道视图应该在哪里,那么一定要使用setFrame:方法。我通常从self.view的大小计算,然后设置setFrame:。 - John
2个回答

5
自从iOS6以来,您不应该使用willRotateToInterfaceOrientation:didRotateFromInterfaceOrientation:。这些仅在最前面的呈现视图控制器上调用,并且不会在其他控制器上调用。这意味着如果您有一个推送的视图控制器或一个呈现的视图控制器,则所有其他控制器的布局都不正确。
相反,您应始终使用viewWillLayoutviewDidLayout来处理旋转。它们都在动画块内调用,因此您执行的任何可动画化的操作都将被动画化。
对于定位视图,您可以手动设置框架,也可以使用自动布局约束并在viewDidLayout中调整约束。如果您选择自动布局路线,请勿删除并添加约束。尽可能使用相同的约束并仅调整它们的constant值。

为什么要在didLayout中调整约束,而不是在willLayout中?我猜你指的是viewWillLayoutSubviews - Doug Smith
@DougSmith 因为很可能您想在其他视图已经布局之后设置约束。使用自动布局,布局的位置并不那么重要,因为两种方法都可以实现类似的效果。 - Léo Natan
好的。如果您提到的是viewWillLayoutSubviews,它不仅在旋转时被调用,在许多其他情况下也会被调用。我如何知道只有在旋转时更改内容,并找出将要旋转到哪个方向?如果您可以发布一个简短的代码示例,说明如何在旋转时使用它,那就太好了。 - Doug Smith
当它被调用时,我如何找出方向是什么? - Doug Smith
@DougSmith [UIApplication sharedApplication].statusBarOrientation@DougSmith [UIApplication sharedApplication].statusBarOrientation - Léo Natan
显示剩余2条评论

-1

当我改变主视图框架时,通常会在willRotateToInterfaceOrientation中进行调整。如果需要的话,然后通过重写我的主视图的layoutSubviews来调整任何子视图。

我不知道这是否是一个明确的答案,虽然我认为真的没有一个明确的答案,这取决于你的应用程序结构。

wilLRotateToInterfaceOrientationdidRotateFromInterfaceOrientation最好用于旋转前后需要执行的操作(例如,在旋转开始之前禁用用户交互,在旋转后重新启用它)。如果可能的话,其他所有操作都应该在layoutSubviews中完成。

自动调整掩码有时很有用,但我通常手动布局所有内容,以避免在iOS版本之间发生任何意外情况(因为它们经常发生变化)。


这两种方法不应用于视图布局。请查看我的答案,了解为什么不应该使用它们。 - Léo Natan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接