在loadView期间或之前获取UINavigationController的内部contentView的CGRect框架

时间:2012-03-07 16:53:40

标签: ios uinavigationcontroller

Apple的文档说:

Note: Because the amount of space available for the custom view can vary
(depending on the size of the other navigation views), your custom view’s
autoresizingMask property should be set to have a flexible width and height.
Before displaying your view, the navigation controller automatically
positions and sizes it to fit the available space.

这很好,除了......我需要知道UINavController将使用 BEFORE 的大小将视图添加到框架中,因为我将要显示的内容因大小而异。

这是在UIViewController的“loadView”方法中,它被添加到UINavigationController。

3 个答案:

答案 0 :(得分:5)

嗯,从技术上讲,您不应该使用loadView方法调整子视图的大小。我不使用nib,在几乎所有的视图控制器中loadView都非常小:self.view = [[UIView alloc] init];。然后,在viewDidLoad中,我将所有子视图添加到self.view。最后,我在viewWillAppear中完成了所有调整大小,因为此时self.view将是合适的大小。

如果您必须使用loadView方法调整视图大小,则必须手动计算尺寸...即:找出设备的方向(self.interfaceOrientation)确定屏幕尺寸,减去你认为在屏幕上的任何其他元素(如导航栏等)。但不建议使用此方法。

答案 1 :(得分:1)

由于未记录导航控制器内的视图层次结构,因此可能无法获得此信息的可靠方法。

你必须:

  1. 要么self.navigationController.view询问其边界并手动减去导航栏占用的房间(如果navigationBarHiddenNO)和工具栏(如果{{1}是} toolbarHidden),

  2. 或手动遍历NO的子视图,并尝试识别内容视图(如果存在此类事物)或其他视图占用的空间。

  3. 这两种解决方案都依赖于可能在未来的iOS版本中发生变化的内部结构,因此远非最佳。你不能等到self.navigationController.view决定要显示什么内容吗?

答案 2 :(得分:0)

如何在viewController.view.frame属性中使用KVO?