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 工作流程中应用自动约束?的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift 平时用到的精华 都在这里啦!

Xamarin改变移动开发的五个理由

AudioUnit Render 回调中的 Objective-C/Swift 用法

你学习的 Kotlin,现在可以开发 iOS 了!来~先睹为快!

Using Swift with Cocoa and Objective-C(Swift 2.0版):开始--基础设置-备

Objective-C:Swift Package 函数中的多参数方法语法