我有一个带有UITabController
的应用,每个标签都是UINavigationController
。我UINavigationControllers
之一的根是UIViewController
。
在视图控制器的视图中,我想布局一些子视图,但我很困惑在哪里和&如何以与分辨率无关的方式布局它们(即不是硬编码值,如320px,480px,44px等)。
当视图完全加载并呈现在垂直iPhone上时,它的高度将为367px = 480 - 20(状态栏) - 44(导航栏) - 49(标签栏)。
在视图控制器中,我目前在viewDidLoad
方法中创建了所有子视图。但是,在此方法中,视图的当前高度似乎为460px(self.view.bounds.size.height
)。因此,在设置我的子视图时,我无法正确计算任何内容的大小。
在viewWillAppear:
方法中,视图确实知道它的大小合适,但这意味着设置&每次出现视图时计算子视图的帧(例如,选项卡更改或从导航堆栈上的子视图控制器弹出。
这是在viewWillAppear:
进行布局的唯一方法吗?
我尝试过使用自动调整属性(父级autoresizesSubviews
& autoresizingMask
),但它们似乎根本不起作用!?这些仅在视图全部设置后才生效,然后调整大小(手动/方向更改?)。
如果有人能让我知道为什么自动调整不起作用,以及如何通过不对任何尺寸进行硬编码来解决问题,我将不胜感激。
答案 0 :(得分:43)
您可以在viewWillLayoutSubviews
的{{1}}内进行布局逻辑。
UIViewController
DOC:在调用视图控制器视图的layoutSubviews方法之前调用。子类可以根据需要实现。默认值为nop。
答案 1 :(得分:33)
autoresizesSubviews
,同时应在子视图上设置autoresizingMask
- 这也是我犯的错误。
在loadView
中,您应该调整子视图的大小以适应当前父视图的大小,然后稍后当父视图从460到367像素调整大小时,您的子视图也会调整大小,根据你上面的面具设置。
如果失败,在viewWillAppear
内设置视图大小没有任何问题 - 每次这样做的性能影响可以忽略不计。
如果没有其他工作,总有layoutSubviews:
- 如果必须,你可以做手动布局,当系统认为布局可能需要改变时,它会被调用。还有setNeedsLayout
:我有时会从viewWillRotate:
/ viewDidRotate
调用:等等。但实际上这不应该是必需的,并且自动调整应该足够好。
编辑:是的,如上所述,要在layoutSubviews
中实现自定义布局逻辑,需要继承UIView
。