Apple documentation提供了有关使用视图控制器管理部分屏幕的以下警告。
注意:您不应该使用视图 控制器来管理填充的视图 只是他们窗户的一部分 - 即 只有部分区域由 应用内容矩形。如果你 想拥有一个由...组成的界面 几个较小的视图,将它们全部嵌入 在单个根视图中并管理它 用你的视图控制器查看。
现在奇怪的是,Apple打破了这个建议。 UITabBarController,UINavigationController,UISplitViewController都反对这一建议。如果忽略这个建议,就Apple forums讨论可能出现的问题。
我找到了关于如何执行此操作的tutorial,但该方法遇到了overlapping the status bar的问题,其中有一个似乎有点狡猾的修复。其他问题有solutions that appear kind of dodgy或advise against doing it。
因此,问题是Apple使用什么方法用于自己的控制器?
答案 0 :(得分:4)
引擎盖下发生了很多事情:
如果您编写自己的视图,您可以使用UIViewController来控制它们,但不要指望UIKit为“正确的”视图控制器提供的所有神奇行为。 / p>
编辑:我迟到时可能不应该使用StackOverflow。我真的是这样的意思:
如果视图由UIViewController控制,则视图控制器应存在于视图控制器层次结构中(即presentModalViewController:animated:
之类的函数)。这允许UIKit处理复杂的位。
当您使用[fooSubview addSubview:viewController.view]
之类的东西时,UIKit可能无法完成它应该做的所有事情。什么保留viewController
?如果有内存警告并且fooSubview被卸载会发生什么?
如果你设置viewController.view.frame = (CGRect){{0,0},{320,480}}
之类的东西,你也会遇到麻烦:UIViewController根据当前状态/导航/标签/等栏设置框架。它可能会重新设置它,或者它可能会使用框架来决定如何布置你推到顶部的视图控制器(我注意到了这种行为;它很混乱)。如果更改viewController.view.transform
,视图旋转可能会发生奇怪的事情,因为视图变换是UIViewController用于方向的(以及状态栏和一堆其他东西)。
我所知道的只有一个得到很好支持的例外:
[window addSubview:viewController.view];
[window makeKeyAndVisible];
(事实上,你可以在窗口内的全窗口视图中粘贴viewController.view;我不确定它是如何工作的。)
我认为在OS 4.0+中你应该设置window.rootViewController = viewController
。
答案 1 :(得分:4)
他们还说不使用自动释放池,但整个样本中都有autorelease
个语句。坚持实用。纯度应该略微次要。