iOS布局传递和约束更新

时间:2017-08-07 18:38:28

标签: ios swift autolayout

从苹果文档中,在延迟布局传递下,它说

'自动布局不是立即更新受影响的视图的帧,而是为不久的将来安排布局传递。此延迟传递更新布局的约束,然后计算视图层次结构中所有视图的帧。'

真正令人困惑的是“不久的将来”这个词。

函数setneedsLayout()表示您希望在更新周期时重绘视图及其所有子视图,但是当您甚至不知道何时更新时,为什么还要打扰调用此函数周期会发生吗?我们不应该一直只使用layoutIfNeeded(),以便我们可以在脑海中说“对,我希望现在更新此视图,因此我将使用layoutIfNeeded()。此外,是否有layoutIfNeeded()的其他用途,而不是UIView.animateWithDuration()中使用它?

我一直在阅读很多文章,这个概念还没有真正坚持下去,谢谢你们

1 个答案:

答案 0 :(得分:0)

您无需在大多数时间直接致电setNeedsLayout()。当您对UIView进行更改时,它将自动致电setNeedsLayout。当您在自动布局中更新约束时,它会将延迟传递消息发送到他们需要布局所需的受影响UIView消息。这将标记视图,因为需要布局它的子视图。您可以通过调用layoutIfNeeded()函数在特定时间布局视图。这将根据需要执行和布局子视图。

正如您所问,调用layoutIfNeeded()函数还有很多用途,而无需在动画块中调用它。

举一个简单的例子,也许您根本不想使用动画,只想布置约束。

subview.frame = CGRect(x: 100, y: 100, width: 50, height: 50) 
// Above makes change to the view. 'setNeedsLayout()' has been called

// Below will layout immediately
view.layoutIfNeeded() 

要回答关于“近期”部分的问题,我不完全确定。一个有根据的猜测是,因为布局变化中所有受影响的UIView必须在特定时间通知布局,这意味着他们还需要计算他们的新帧。根据调用UIView函数的setNeedsLayout()的数量,可能会涉及一些重要的处理时间。这也许就是他们在“不久的将来”所说的原因。