2010-01-10 68 views
48

我有一个应用程序,使用UITabController,每个标签是UINavigationController。我的UINavigationControllers之一的根是UIViewController在UIViewController中布置和设定子视图的大小

在该视图控制器的视图中,我想布置一些子视图,但我很困惑,在哪里如何将它们放在一个独立于分辨率的方式(即不是硬编码值,如320px,480px, 44px等)。

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

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

viewWillAppear:方法,认为知道这是适当的大小,但是这意味着设置&每个视图会出现时间(例如标签的变化来计算子视图的框架或子视图控制器导航堆栈上弹出。

是在viewWillAppear:

适当做这个布局的唯一方法我已经使用自动尺寸属性尝试(父母的autoresizesSubviews & autoresizingMask),但他们似乎并没有在所有的工作!?做这些只有在视图全部设置后才能生效,然后调整大小(手动/方向更改?)。

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

回答

32

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

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

如果失败,将视图大小设置在viewWillAppear内没有任何问题 - 每次执行此操作的性能影响可以忽略不计。

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

编辑:是的,为了实现layoutSubviews中的自定义布局逻辑,正如我在上面提到的那样,需要继承UIView的子类。

+2

快速说明,UIViewController没有,也没有调用layoutSubviews。这是UIView上的一个方法。但是,您可以制作一个名为layoutSubviews的方法,并从viewWillAppear调用该方法: – casademora 2011-04-10 19:27:07

+1

也没有“loadViews”。我认为你的意思是“viewDidLoad”,在这种情况下,值得一提的是在viewDidUnload中也释放这些视图。 – DougW 2011-06-01 00:19:07

+0

有一个loadView方法,但viewDidLoad通常是添加子视图最方便的地方 – 2011-09-04 00:42:23

40

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

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

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

+2

任何区别,如果我使用viewDidLayoutSubviews而不是? – 2015-09-25 14:11:16

相关问题