Objective-C/Swift (iOS) 啥时候在 View/ViewController 工作流程中应用自动约束?
Posted
技术标签:
【中文标题】Objective-C/Swift (iOS) 啥时候在 View/ViewController 工作流程中应用自动约束?【英文标题】:Objective-C/Swift (iOS) When are the auto-constraints applied in the View/ViewController work flow?Objective-C/Swift (iOS) 什么时候在 View/ViewController 工作流程中应用自动约束? 【发布时间】:2015-04-16 12:45:16 【问题描述】:我在弄清楚何时在视图设置过程中应用 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)
【问题讨论】:
【参考方案1】:约束在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
。
【讨论】:
在使用自定义 UITableViewCell 子类时,仅此一项并没有立即更新框架;只滚动离开一个单元格并再次导致它被布置。在我的updateConstraints
覆盖末尾添加setNeedsLayout(); layoutIfNeeded
似乎已经修复了它。令人惊讶的是,用layout
替换layoutIfNeeded
不起作用,即使在setNeedsLayout
之后也是如此。【参考方案2】:
Xcode 8 的注意事项: 如果您使用自动布局,您可能会遇到新功能的问题:查看为 [任何设备]。当您在另一台设备(模拟器)上测试您的应用并具有推断屏幕时,该设备的屏幕边界将应用于 viewWillLayoutSubviews。
【讨论】:
【参考方案3】:你可以使用方法
override func layoutSubviews()
super.layoutSubviews()
//the frames have now their final values, after applying constraints
但是这个方法会在视图的生命周期中被多次调用,比如方向改变或者视图的移入移出,所以需要自己处理。
【讨论】:
以上是关于Objective-C/Swift (iOS) 啥时候在 View/ViewController 工作流程中应用自动约束?的主要内容,如果未能解决你的问题,请参考以下文章
AudioUnit Render 回调中的 Objective-C/Swift 用法
你学习的 Kotlin,现在可以开发 iOS 了!来~先睹为快!
Using Swift with Cocoa and Objective-C(Swift 2.0版):开始--基础设置-备