什么是时下设计多方位的iPad应用程序的正确方法是什么? 我已经读了很多苹果的文档,网络资源和一些SO Q&A的。 这里是我最初的要求:
- 这有可能在iOS 5及以上工作。 无需创建回到与iOS的previos版本的兼容性。
- 我想如果可能的话有画像和不同的NIB文件中定义的横向的UI。
- 我的NIB文件将具有在不同的方向(同UI元素不同的图像就像我会有
header.png
和header-landscape.png
的UIImageView例如。 - 应用程序将有多个画面,我需要能够开启他们每个人的方位。
所以,我该怎么办?
- 创建每个屏幕都有一个VC和替换底层视图
willRotate
处理? - 创建每个方向上的一个VC? 但随后你如何正确地进行切换呢?
- 简单地重新排列元素将无法正常工作(我认为),因为我将不得不重新加载图像。
- 写代码的一切(我真的很讨厌这种想法)?
什么是正确的方法对这一问题作为今天的?
其实,我觉得这是一个非常复杂的问题,最喜欢的架构问题。 我不相信你应该尝试只用一个技术来解决这个问题。
对于此页面上没有排挤掉其他所有答案的缘故, 我贴在我的博客全的书面记录和一些示例代码的链接,也
摘要
它应首选表达的.xib文件你的用户界面,但在多大程度上你让自己偏离此部分依赖于技能谁将会改变你的应用在未来的人哪。 这可能不只是程序员 !
首选方案
应大力优先实施一个的.xib文件,一个一个逻辑视图UIViewController
子类。 尝试真的很难做到这一点。 设置autoresizesSubviews=YES
您XIB的根view
,并适当调整孩子的意见autoresizingMask
随着屏幕尺寸的变化弯曲/方向可以走很长的路要走。
但是,这不会永远是不够的。 如果您的布局需要在横向调整,超出了自动尺寸可以处理,我用两个主要选择。 哪一个你应该选择取决于你的观点的内容。
方案一
如果纵向或横向布局也差不太多,那么我建议您用一个的.xib住,并在你的浏览器的代码,一点点地在旋转调整布局。
方案二
如果横向和纵向差异是否真有显著,那么我推荐每个方向(有严格的命名惯例,像一个的.xib MyViewController.xib
和MyViewController-landscape.xib
)。 但是,这两个文件的.xib应该文件的所有者连接到同一个视图控制器类! 对我来说,这是关键。
如果你曾经打算做什么,但首选替代,我建议创建一个可重用UIViewController
基类来自动完成这个,并保持一致。 它比你想象的多首作品,这是愚蠢的,以保持在每一个这样做UIViewController
子类需要旋转处理。
解
我创造了这样一个基类,并把它放在一个示例项目在这里。 你可以看到我是怎么想的所有三种情形应如何处理一个Hello World例子:
- 一个视图控制器和一个的.xib,只有在自动(我
FirstViewController
) - 一个视图控制器和两个.xibs,与自动化它们之间的切换(我的
SecondViewController
) - 一个视图控制器和一个的.xib,次编程布局上旋转(
ThirdViewController
)
该RotatingViewController我使用的基类,同样适用于iPhone应用程序。 其实我有一个处理保持iPad 和 iPhone更复杂的版本,纵向和横向布局(通用应用程序)。
但是,这个问题只有约的iPad,所以我剥离下来,更容易理解。
我的基类也有一个实用imageNamed:
方法,帮助那些合适的当前方位(带图像landscape.png约定命名)加载图像。 不过,我觉得伸展UIImages应使用 ,而不是绝大多数的时间。
我没有这样做,而是RotatingViewController
也可以尝试走其subviews
树和更新image
物业UIButton
或UIImageView
对象,设备方向变化时。 我没有去那个长度,但你可以。
这些建议更多的理由是可以在博客文章我引用
因此,与缺乏这一问题的答案和时间是一个问题,我最后做了以下内容:
- 二手Interface Builder来创建NIB文件在纵向所有屏幕。 绑定,需要一些布局网点的所有控件。
- 二手IB创造横向NIB文件为好,但用它仅作参考,看看那里的UI元素的帧将是景观。
- 增加了代码,重新安排所有元素为横向和回肖像
willAutoRotate
处理程序。
这种方法让我在名单IB广大用户界面的创建的灵活性。 我还需要不断代码重新安排元素,以不同的方向,但通常这种只涉及setFrame
的标签,按钮等方法,并imageNamed
的图像。 这是更小的范围,然后直接在代码中创建的所有UI。
我会尽快SO允许打开这个问题的赏金,因为我觉得这个问题是非常重要和有益的任何开发人员创建为iPad / iPhone的普及和多方位的应用程序。
我用3种不同的技术,其中1个我认为是“正确”的方式来处理多个方向。
- 不正确:创建了两个不同的笔尖/ xibs。 不“坏”,但它是一个痛苦的处理情况和状态,当你不断重建中的UIViewController的UIView的。
- 不正确:用一个笔尖和基于绝对坐标重新定位他们在旋转。 这是错误的方式来做到这一点。 我一遍又一遍地看到了这一点,但它可以完成处理多浏览模式最糟糕的方式。 这方面的一个症状是UIViews是设备方向感知。 完全不必要的。
- 正确 :使用autoresizingMask的视图中的元素,以它们浮到设备旋转的适当位置,调整究竟能不能使用的CGRect帧的方式来实现。 我只有这样做一次对准东西。 恕我直言,这是处理多个装置定向“正确”的方式。 UIView的任何子视图并不需要了解旋转。 您可以使用每个屏幕都有一个VC有许多子视图,并保持它的简单。 如果你的布局可以通过这种方式,可以设计出与浮动元素,那么你是金色和UI是轻而易举的事情。
只是我的两分钱。
编辑:iOS 6的自动版式介绍,并可以代替“支柱和弹簧”的使用- https://developer.apple.com/library/ios/documentation/userexperience/conceptual/AutolayoutPG/Introduction/Introduction.html
令人失望的是,我认为苹果不会提供使用多个XIB文件(每个方向)为给定的视图控制器的方式 - 这将是处理方向问题一个很好的方式,因为在自动很少(只有它处理的方向以及非常简单的接口工程)。
你可以这样做,而不是:创建肖像XIB并分配在每个XIB子视图具有独特的标记属性。 然后复制XIB和景观重新做布局(所以现在你有两个XIBs,一个纵向和横向一个)。
当你的应用程序启动,最初创建您的视图控制器从哪个XIB是适当的启动方向。 递归遍历所有的子视图,并创建一个包含所有子视图帧,通过对每个子视图的标签属性键的字典。
接下来,创建与其他取向的XIB临时视图控制器,然后执行相同的递归迭代中,存储由标签键固定到第二词典中的所有帧(每个字典相匹配的方向之一,并且应该相应地命名)。 然后处理该第二临时视图控制器。
在layoutSubviews
(实际上在viewDidLayoutSubviews
,因为你正在处理的视图控制器,你可以做iOS 5以上),所有你需要做的就是递归遍历所有的子视图,并分配给每个从帧的字典子视图框架适合当前方位的基础上,子视图的标签属性。
这种技术可以让您保存您的视图控制器的状态,而不必每次方向改变时重新加载它。 它还允许你使用IB来布置你的视图控制器,所以你不必写一堆的手动布局代码。
为什么一个应用程序,可以做相当一切后运行? 当你设计一个应用程序,你决定什么是它的最佳方向 - 横向或纵向 - 即使你的应用程序的设计需要一个反方向(全部是景观和1-2控制器肖像,反之亦然),你将据此做出的碎粒。 那么,在某些情况下,你需要一个控制器来支持所有的方向,你会做到这一点。
但是,试图让所有的控制器,支持所有方向......嗯,我觉得这个想法有点怪。
万一你还是想做到这一点,你已经列出的可能的解决办法,我喜欢最后一个选项。