在 iOS 7 中处理界面旋转

Posted

技术标签:

【中文标题】在 iOS 7 中处理界面旋转【英文标题】:Handling interface rotation in iOS 7 【发布时间】:2014-02-24 17:54:05 【问题描述】:

非常简单的问题,但我提出的问题似乎有很多相互矛盾的观点,而且我完全无法找到明确的答案,更不用说现代答案了。

UIViewController 中,我在处理用户从纵向变为横向或反之亦然的处理过程中,99% 都使用自动布局。效果很好。但有时,出于某种原因,我仍然不得不依赖框架。

我将如何最好地处理这个问题?

您有willAnimateRotationToInterfaceOrientationwillRotateToInterfaceOrientationNSNotification 方法和检查状态栏,我相信还有其他方法。

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

【问题讨论】:

肯定是 setFrame:如果你知道视图应该在哪里。我一般是从self.view的大小计算然后setFrame: 【参考方案1】:

ios6 开始,您不应该使用 willRotateToInterfaceOrientation:didRotateFromInterfaceOrientation:。这些仅在最前面呈现的视图控制器上调用,不会在其他视图控制器上调用。这意味着如果你有一个推送的视图控制器或一个呈现的视图控制器,所有其他的都不会正确布局。

相反,您应该始终使用viewWillLayoutviewDidLayout 来处理旋转。它们都在动画块中调用,因此您所做的任何可动画的操作都会被动画化。

对于定位视图,您可以自己设置框架,也可以使用自动布局约束并调整viewDidLayout 中的约束。如果你走自动布局路线,永远不要删除和添加约束。尽可能使用相同的约束,只需调整它们的 constant 值即可。

【讨论】:

为什么要调整didLayoutwillLayout 中的约束?我假设你指的是viewWillLayoutSubviews? @DougSmith 因为您可能希望在其他视图已经布局之后设置约束。使用自动布局,您在哪里进行布局变得不那么重要了,因为两者都会达到类似的效果。 好的。如果你指的是viewWillLayoutSubviews,它不是在很多情况下都会被调用,而不仅仅是轮换吗?我怎么知道只改变旋转的东西,并弄清楚旋转将被旋转到什么位置?如果您能发布一个简短的代码示例说明如何在轮换中使用它,那就太好了。 @DougSmith 你为什么要担心这个?当系统调用布局时,需要确保系统布局正确。如果你的约束没有改变,什么都不会发生。 当它被调用时我如何找出方向是什么?【参考方案2】:

当我更改主视图框架时,如果需要,我通常会调整 willRotateToInterfaceOrientation 中的框架。然后我通过覆盖主视图的 layoutSubviews 来调整任何子视图。

不过,我不知道这是一个确定的答案 - 我不认为真的有一个确定的答案 - 这取决于您的应用程序的结构。

wilLRotateToInterfaceOrientationdidRotateFromInterfaceOrientation 最适合分别用于在轮换之前和之后需要做的事情(例如,在轮换开始之前禁用用户交互,然后重新启用它)。如果可能,其他一切都应该在 layoutSubviews 中完成。

自动调整蒙版有时很有用,但我通常手动布置所有内容,以避免在 iOS 版本之间发生变化时出现任何意外(就像他们经常做的那样)。

【讨论】:

这两种方法不应该用于视图布局。请参阅我的回答,了解为什么不这样做。

以上是关于在 iOS 7 中处理界面旋转的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 6 上处理 iDevice 旋转

苹果手机(ios)拍照上传图片旋转90度问题---java后台处理

在 iOS 7 中触发或延迟自动旋转

如何在一个视图不应该自动旋转而一个视图应该自动旋转的 iOS 应用程序中处理自动旋转?

在 ios 中,视图控制器中移动子视图以处理旋转的正确位置在哪里?

处理旋转时更改的 iOS 键盘布局