如何正确设计多方位的iPad应用程序

sha*_*sha 15 iphone objective-c interface-builder orientation ipad

现在设计多方位iPad应用程序的正确方法是什么?我已经阅读了很多Apple文档,网络资源和一些SO Q&A.这是我最初的要求:

  • 这必须适用于iOS 5及更高版本.无需创建与previos版本的iOS的兼容性.
  • 我想尽可能在​​不同的NIB文件中定义纵向和横向UI.
  • 我的NIB文件将针对不同方向的相同UI元素具有不同的图像(例如我将拥有header.pngheader-landscape.pngUIImageView).
  • 应用程序将有几个屏幕,我需要能够在每个屏幕上切换方向.

那我该怎么办?

  • 每个屏幕创建一个VC并替换willRotate处理程序中的底层视图?
  • 每个方向创建一个VC?但那么你如何正确切换它们呢?
  • 简单地重新安排元素将无法工作(我认为),因为我将不得不重新加载图像.
  • 用代码写一切(我真的很讨厌这个想法)?

到目前为止,这个问题的正确方法是什么?

Nat*_*ate 17

我实际上认为这是一个非常复杂的主题,就像大多数架构问题一样.我不相信你应该尝试用一种技术解决问题.

为了不在本页面上排除所有其他答案,我在我的博客上发布了一个完整的文章,提供了一些示例代码的链接

摘要

应该首选在.xib文件中表达您的UI,尽管您允许自己偏离此范围的程度部分取决于将来修改您的应用程序的人员的技能组合.它可能不只是程序员!

首选方案

应该强烈优先使用一个.xib文件和一个子类实现一个逻辑视图UIViewController.努力做到这一点真的很难.autoresizesSubviews=YES在XIB的根目录上进行设置view,并autoresizingMask根据屏幕大小/方向的变化正确调整子视图以进行灵活调整可能会有很长的路要走.

但是,这并不总是足够的. 如果您的布局需要横向调整,超出自动调整可以处理的范围,我使用两个主要选项.您应该选择哪一个取决于您的观点的内容.

方案一

如果纵向与横向的布局没有太大区别,那么我建议使用一个.xib,并在View Controller中使用一些代码来调整旋转布局.

方案二

如果横向与纵向差异非常重要,那么我建议每个方向都有一个.xib(具有严格的命名约定,如MyViewController.xibMyViewController-landscape.xib).但是,两个.xib文件都应该将File的Owner连接到同一个View Controller类!对我来说,这是关键.

如果您要做除了首选替代方案之外的任何事情,我建议创建一个可重用的UIViewController基类来自动执行此操作,并使其保持一致.这比你最初想象的要多得多,而且在每个UIViewController需要轮换处理的子类中继续这样做是很愚蠢的.


我创建了这样一个基类,并将其放在一个示例项目中. 您可以看到一个Hello World示例,说明我应该如何处理所有三个场景:

  • 一个视图控制器和一个.xib,仅自动调整(我的FirstViewController)
  • 一个视图控制器和两个.xibs,它们之间自动切换(我的SecondViewController)
  • 一个视图控制器和一个.xib,在旋转时具有次要的编程布局(ThirdViewController)

我使用的RotatingViewController基类同样适用于iPhone应用程序.我实际上有一个更复杂的版本,处理维护iPad iPhone,纵向横向布局(对于通用应用程序).

但是,这个问题只是关于iPad,所以我将其剥离,以便更容易理解.

我的基类还有一个实用程序imageNamed:方法,可以帮助加载适合当前方向的图像(使用image-landscape.png约定命名).但是,我认为绝大部分时间都应该使用可伸缩的UIImages.

我没有这样做,但是当设备方向改变时,RotatingViewController它也可以尝试遍历它的subviews树并更新image属性UIButtonUIImageView对象.我没有那么长,但你可以.

有关这些建议的更多理由可以在我参考的博客文章中找到