布局&在UIViewController中调整子视图的大小

时间:2010-01-10 16:59:30

标签: iphone cocoa-touch uikit uiview

我有一个带有UITabController的应用,每个标签都是UINavigationController。我UINavigationControllers之一的根是UIViewController

在视图控制器的视图中,我想布局一些子视图,但我很困惑在哪里和&如何以与分辨率无关的方式布局它们(即不是硬编码值,如320px,480px,44px等)。

当视图完全加载并呈现在垂直iPhone上时,它的高度将为367px = 480 - 20(状态栏) - 44(导航栏) - 49(标签栏)。

在视图控制器中,我目前在viewDidLoad方法中创建了所有子视图。但是,在此方法中,视图的当前高度似乎为460px(self.view.bounds.size.height)。因此,在设置我的子视图时,我无法正确计算任何内容的大小。

viewWillAppear:方法中,视图确实知道它的大小合适,但这意味着设置&每次出现视图时计算子视图的帧(例如,选项卡更改或从导航堆栈上的子视图控制器弹出。

这是在viewWillAppear:进行布局的唯一方法吗?

我尝试过使用自动调整属性(父级autoresizesSubviews& autoresizingMask),但它们似乎根本不起作用!?这些仅在视图全部设置后才生效,然后调整大小(手动/方向更改?)。

如果有人能让我知道为什么自动调整不起作用,以及如何通过不对任何尺寸进行硬编码来解决问题,我将不胜感激。

2 个答案:

答案 0 :(得分:43)

您可以在viewWillLayoutSubviews的{​​{1}}内进行布局逻辑。

UIViewController

DOC:在调用视图控制器视图的layoutSubviews方法之前调用。子类可以根据需要实现。默认值为nop。

答案 1 :(得分:33)

应该在父视图上设置

autoresizesSubviews,同时应在子视图上设置autoresizingMask - 这也是我犯的错误。

loadView中,您应该调整子视图的大小以适应当前父视图的大小,然后稍后当父视图从460到367像素调整大小时,您的子视图也会调整大小,根据你上面的面具设置。

如果失败,在viewWillAppear内设置视图大小没有任何问题 - 每次这样做的性能影响可以忽略不计。

如果没有其他工作,总有layoutSubviews: - 如果必须,你可以做手动布局,当系统认为布局可能需要改变时,它会被调用。还有setNeedsLayout:我有时会从viewWillRotate: / viewDidRotate调用:等等。但实际上这不应该是必需的,并且自动调整应该足够好。

编辑:是的,如上所述,要在layoutSubviews中实现自定义布局逻辑,需要继承UIView