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
设置时遇到了一些问题。
更多解释:
- 我已经为一个视图设置了一个
XIB
- 我将 "Simulated Metrics" 尺寸设置为 iPhone 3.5 英寸
- 我已将自动约束添加到此视图中的子视图
- 在视图控制器中,我在
viewDidLoad
方法中执行依赖于子视图的某些操作 (IBOutlet
) frames/bounds
- 在视图中,我根据子视图执行某些操作 (
IBOutlet
) frames/bounds
在 awakeFromNib
方法中
在这 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
}
但是这个方法在视图的生命周期中会被多次调用,比如方向改变或者移入移出视图,所以你需要处理这个。
我在确定何时在视图设置过程中应用 XIB
上的 auto-contraints
设置时遇到了一些问题。
更多解释:
- 我已经为一个视图设置了一个
XIB
- 我将 "Simulated Metrics" 尺寸设置为 iPhone 3.5 英寸
- 我已将自动约束添加到此视图中的子视图
- 在视图控制器中,我在
viewDidLoad
方法中执行依赖于子视图的某些操作 (IBOutlet
)frames/bounds
- 在视图中,我根据子视图执行某些操作 (
IBOutlet
)frames/bounds
在awakeFromNib
方法中
在这 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
}
但是这个方法在视图的生命周期中会被多次调用,比如方向改变或者移入移出视图,所以你需要处理这个。