在UIViewController中布置和调整子视图的大小

Mic*_*all 50 iphone cocoa-touch uikit uiview

我有一个带有a的应用程序,UITabController每个选项卡都是一个UINavigationController.我UINavigationControllers的一个根是一个UIViewController.

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

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

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

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

这是正确布局的唯一方法viewWillAppear:吗?

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

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

aum*_*ets 44

你可以做你的布局逻辑里面viewWillLayoutSubviewsUIViewController.

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    // Your layout logic here
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我使用viewDidLayoutSubviews而有任何区别? (5认同)

Den*_*kem 35

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

loadView您应该调整子视图的大小以适应当前父视图的大小,然后在父视图从460到367像素的大小调整后,您的子视图也将根据上面的掩码设置调整大小.

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

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

编辑:是的,要实现自定义布局逻辑,layoutSubviews如上所述,需要子类UIView.

  • 对于它的价值,iOS 5.0向视图控制器类添加了两个新函数`viewWillLayoutSubviews`和`viewDidLayoutSubviews`,这可能会有所帮助. (42认同)
  • 快速澄清,UIViewController没有,也没有调用layoutSubviews.这是UIView上的一种方法.但是,您可以创建一个名为layoutSubviews的方法,并从viewWillAppear调用它: (2认同)
  • "但实际上这不应该是必需的并且自动调整应该足够好"在很多情况下自动调整掩码是不够的:例如,从上到下有3个等分的子视图的视图. (2认同)