从苹果文档中,在延迟布局传递下,它说
'自动布局不是立即更新受影响的视图的帧,而是为不久的将来安排布局传递。此延迟传递更新布局的约束,然后计算视图层次结构中所有视图的帧。'
真正令人困惑的是“不久的将来”这个词。
函数setneedsLayout()
表示您希望在更新周期时重绘视图及其所有子视图,但是当您甚至不知道何时更新时,为什么还要打扰调用此函数周期会发生吗?我们不应该一直只使用layoutIfNeeded()
,以便我们可以在脑海中说“对,我希望现在更新此视图,因此我将使用layoutIfNeeded()
。此外,是否有layoutIfNeeded()
的其他用途,而不是UIView.animateWithDuration()
中使用它?
我一直在阅读很多文章,这个概念还没有真正坚持下去,谢谢你们
答案 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()
的数量,可能会涉及一些重要的处理时间。这也许就是他们在“不久的将来”所说的原因。