如何在 iPad 中自动旋转期间重新排列视图

Posted

技术标签:

【中文标题】如何在 iPad 中自动旋转期间重新排列视图【英文标题】:How to rearrange views during autorotation in iPad 【发布时间】:2013-07-25 23:30:16 【问题描述】:

一个视图控制器有六个矩形视图。在横向模式下,我想将它们排列成 3 列和 2 行。但在纵向模式下,我想将它们排列成 2 列和 3 行。

iPad横屏和竖屏旋转时如何实现?

我是否需要两个 nib 文件:一个用于横向 3 列 2 行,另一个用于纵向 2 列 3 行,并在自动旋转期间交换它们?

还是别的什么?实现这一点的最佳方法是什么?谢谢。

【问题讨论】:

我认为这取决于您希望如何安排它们的细节。在横向模式中,顶行可能有 1、2 和 3,底行可能有 4、5 和 6。但是,当您将设备 90 度 顺时针 旋转时, 会在顶行有 1 和 2,在中间行有 3 和 4,在中间有 5 和 6最下面一行?或者你会在顶行放 4 和 1,在中间排放 5 和 2,在底排放 6 和 3? 【参考方案1】:

您只需要 1 个 nib 文件。为您的列/行创建 IBOutlets,然后手动设置它们:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;

您还需要确保在 viewWillAppear 中调用 willRotateToInterfaceOrientation 以确保在以横向模式进入视图时正确设置列/行的初始位置。

【讨论】:

为了更容易,您甚至可以将您不使用的方向(即纵向)的 alpha 设置为 0.5 或 .0,以便您可以轻松地在其他方向(风景)【参考方案2】:

也许你想看看 UICollectionView。它可能对你有用。否则,您应该考虑使用自动布局。如果您使用两个 nib,则可以使用 UIViewControllers 方法,例如

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;

或者,layoutSubviews 在设备旋转时被调用,您可以在那里执行任何操作。 我认为如果差异相当小,那么您不需要使用两个不同的 Nib。

【讨论】:

【参考方案3】:

您可以使用 2 个 xib 来完成,或者如果您使用布局约束,您可以将其设置为纵向模式(在 IB 中),然后在代码中将这些约束保存到 viewDidLoad 中的数组中。在 willAnimateRotationToInterfaceOrientation:duration: 方法中,为横向创建新的约束并将它们添加到超级视图。查看我对这个问题的回答,UIView to Ignore Orientation or Stick-To-Bottom Container,以了解我是如何做到这一点的。

【讨论】:

以上是关于如何在 iPad 中自动旋转期间重新排列视图的主要内容,如果未能解决你的问题,请参考以下文章

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

UICollectionView 在旋转时重新排列单元格

UIImagePickerController(使用相机作为源)在 iPad2 上自动旋转,我该如何停止它?

如何在某些情况下停止 iPad 旋转?

设备方向更改时如何重新排列集合视图单元格

ipad 应用程序 - 方向旋转性能很差