美文网首页
setNeedsLayout和layoutIfNeeded

setNeedsLayout和layoutIfNeeded

作者: 再好一点点 | 来源:发表于2021-09-13 11:40 被阅读0次

在使用布局约束的时候有时候需要立即获取视图的frame信息,这时候获取到的全部都是0,这是因为刚添加完约束条件,这时候布局并没有执行,默认会在接下来的RunLoop循环当中执行。如果需要立刻得到正确的frame信息,可以使用setNeedsLayout和layoutIfNeeded。

setNeedsLayout
调用setNeedsLayout,这时候会向RunLoop添加一个标记,告诉RunLoop有视图需要重新布局。然后异步调用layoutIfNeeded刷新布局,不立即刷新,会在下一轮RunLoop结束前刷新,对于这一轮RunLoop之内的所有布局和UI上的更新只会刷新一次,layoutSubviews一定会被调用。

layoutIfNeeded
调用layoutIfNeeded以后,会在当前RunLoop循环中判断有没有需要刷新的标记,如果有会立即调用layoutSubviews进行布局,为同步执行。如果没有标记,不会调用layoutSubviews。

由谁调用
比如B视图的父视图是A视图,这时候如果想要获取B视图的frame信息就需要使用A视图调用上述方法。

视图裁剪
如果需要对使用约束的视图进行裁剪,视图在view里边一般在layoutSubviews方法内处理。如果在控制器里边一般在viewDidLayoutSubviews内处理。需要在方法内先调用父类的方法。

相关文章

网友评论

      本文标题:setNeedsLayout和layoutIfNeeded

      本文链接:https://www.haomeiwen.com/subject/yixfgltx.html