在UIViewController中布置和设定子视图的大小

我有一个与UITabController的应用程序,每个选项卡是一个UINavigationController 。 我的一个UINavigationControllers的根是一个UIViewController

在视图控制器的视图中,我想要布局一些子视图,但我很困惑,在哪里以及如何以独立于分辨率的方式(即不是硬编码值,如320px,480px,44px等等)进行布局。 )。

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

在视图控制器内,我目前在viewDidLoad方法中创build了所有的子视图。 但是,在这个方法中,视图的当前高度是460px(self.view.bounds.size.height)。 所以在设置我的子视图时,我无法正确计算任何东西的大小。

viewWillAppear:方法中,视图确实知道它的大小,但是这意味着每当视图出现时设置和计算子视图的框架(例如,标签更改或从导航堆栈中的子视图控制器popup。

唯一的方法是正确地做到这一点在viewWillAppear:布局viewWillAppear:

我试过使用autoresizing属性(父母的autoresizesSubviewsautoresizingMask ),但他们似乎并没有工作!? 这些只有在视图全部设置后才能生效,然后resize(手动/方向更改?)。

如果有人能让我知道为什么autoresizing不起作用,以及如何通过不对任何大小进行硬编码来最好地解决问题,我将不胜感激。

autoresizesSubviews应该设置在你的父视图上,而autoresizingMask应该设置在子视图上 – 这是我犯的错误,所以你也可以。

loadView你应该调整你的子视图,以适合目前父视图的大小,然后在父视图从460到367像素resize时,根据上面的掩码设置,你的子视图也将被resize。

如果失败了,在viewWillAppear中设置视图大小没有任何问题 – 每次执行的性能影响可以忽略不计。

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

编辑:是的,要实现layoutSubviews自定义布局逻辑,我上面提到一个将需要UIView

您可以在UIViewControllerviewWillLayoutSubviews中执行布局逻辑。

 -(void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; // Your layout logic here } 

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