我实际上认为这是一个非常复杂的主题,就像大多数架构问题一样。我不认为您应该尝试仅使用一种技术来解决问题。
为了不排挤此页面上的所有其他答案,我在我的博客上发布了一篇完整的文章和一些示例代码的链接,也是
概括
最好在 .xib 文件中表达您的 UI,尽管您允许自己偏离这一点的程度部分取决于将来修改您的应用程序的人员的技能组合。可能不仅仅是程序员!
首选选项
强烈建议使用一个 .xib 文件和一个子类来实现一个逻辑UIViewController
视图。努力做到这一点。设置autoresizesSubviews=YES
您的 XIB 的 root view
,并适当地调整子视图autoresizingMask
以适应屏幕尺寸/方向的变化可以有很长的路要走。
但是,这并不总是足够的。 如果您的布局需要横向调整,超出自动调整大小可以处理的范围,我使用两个主要选项。您应该选择哪一个取决于您的视图内容。
选项一
如果纵向与横向的布局差别不大,那么我建议保留一个 .xib,并在视图控制器中添加一些代码来调整旋转布局。
选项二
如果横向与纵向的差异非常显着,那么我建议为每个方向使用一个 .xib(具有严格的命名约定,例如MyViewController.xib
and MyViewController-landscape.xib
)。但是,两个 .xib 文件都应该将File's Owner连接到同一个 View Controller类!对我来说,这是关键。
如果您打算做任何事情,而不是首选替代方案,我建议创建一个可重用的UIViewController
基类来自动执行此操作并保持一致。这比你一开始想象的要多,而且在每个UIViewController
需要轮换处理的子类中继续这样做是很愚蠢的。
解决方案
我创建了这样一个基类,并将其放在此处的示例项目中。 您可以看到一个 Hello World 示例,说明我认为应该如何处理所有三种情况:
- 一个视图控制器和一个 .xib,仅自动调整大小(我的
FirstViewController
)
- 一个视图控制器和两个 .xib,在它们之间自动切换(我的
SecondViewController
)
- 一个视图控制器和一个 .xib,具有较小的旋转编程布局 (
ThirdViewController
)
我使用的RotatingViewController基类同样适用于 iPhone 应用程序。实际上,我有一个更复杂的版本来处理维护 iPad和iPhone、纵向和横向布局(用于通用应用程序)。
但是,这个问题只是关于 iPad 的,所以我把它删掉了,以便更容易理解。
我的基类还有一个实用imageNamed:
方法,可以帮助加载适合当前方向的图像(以image-landscape.png约定命名)。但是,我认为绝大多数时候应该使用可拉伸的 UIImages 。
我没有这样做,但是当设备方向改变时,RotatingViewController
它也可以尝试遍历它的subviews
树并更新对象的属性image
。我没有做到这一点,但你可以。UIButton
UIImageView
这些建议的更多理由可在我参考的博客文章中找到