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

Objective-C/Swift (iOS) When are the auto-constraints applied in the View/ViewController work flow?

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

更多解释:

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

何时应用这些自动约束以及何时需要子视图的 ACTUAL frame/bounds 进行任何必要的操作?

我正在使用 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

Xcode8 的注意事项: 如果您使用自动布局,您可能会遇到新功能问题:以[任何设备]查看。当您在另一台设备(模拟器)上测试您的应用程序并拥有 inferred 屏幕时,此设备的屏幕边界将应用于 viewWillLayoutSubviews.

你可以使用方法

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

}

但是这个方法在视图的生命周期中会被多次调用,比如方向改变或者移入移出视图,所以你需要处理这个。