8

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

更多解释:

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

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

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

我正在使用 XCode 6.3、Swift (1.2)

4

3 回答 3

13

在该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

于 2015-04-16T13:28:55.427 回答
0

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

于 2017-03-16T15:39:50.197 回答
0

你可以使用方法

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

}

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

于 2019-02-25T13:30:25.263 回答