在使用布局约束的时候有时候需要立即获取视图的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内处理。需要在方法内先调用父类的方法。
网友评论