Objective-C/Swift(iOS)View/ViewController工作流中何时应用自动约束



我在弄清楚XIB上的auto-contraints设置何时在视图设置过程中应用时遇到了一些问题。

更多解释:

  • 我已经为视图设置了XIB
  • 我将"模拟指标"大小设置为iPhone 3.5英寸
  • 我已将自动约束添加到此视图中的子视图
  • 在视图控制器中,我根据viewDidLoad方法中的子视图(IBOutlet)frames/bounds执行某些操作
  • 在视图中,我根据awakeFromNib方法中的子视图(IBOutlet)frames/bounds执行某些操作

在这两种方法(ViewController::viewDidLoad and View::awakeFromNib)中,已加载IBOutlet视图,但尚未应用约束。当使用更大的模拟器(如iPhone 6模拟器)时,实际帧仍然设置为iPhone 3.5英寸大小(宽度320)

这些自动约束何时应用?需要子视图的实际框架/边界的任何必要操作应在何时进行?

我使用XCode 6.3,Swift(1.2)

约束在layoutSubviews方法中应用。因此,如果你想在UIView子类中应用它们之后做一些事情,请重写方法:

override func layoutSubviews() {
super.layoutSubviews()
//the frames have now their final values, after applying constraints
}

UIViewController子类中,使用viewDidLayoutSubviews用于相同的目的:

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
//the frames have now their final values, after applying constraints
}

请注意,如果向视图添加了自动布局约束,则不应为视图设置frame/bounds

注意Xcode 8:如果您使用自动布局,您可能会遇到新功能的问题:视为[任何设备]。当你在另一台设备(模拟器)上测试你的应用程序并推断出屏幕时,该设备的屏幕边界将应用于viewWillLayoutSubviews

您可以使用方法

override func layoutSubviews() {
super.layoutSubviews()
//the frames have now their final values, after applying constraints

}

但是,在视图的生命周期中,这种方法将被调用多次,例如方向更改或移入和移出视图,因此需要处理此问题。

最新更新