下面列举下iOS layout的相关方法:
layoutSubviews
layoutIfNeeded
setNeedsLayout
setNeedsDisplay
drawRect
sizeThatFits
sizeToFit
首先layoutSubviews什么时候会被调用,所有涉及到视图以及其子视图frame变化的情况都会调用layoutSubviews,比如initWithFrame,setFrame,滚动一个ScrollView,旋转Screen,添加视图addSubView也会触发。
-setNeedsLayout方法:标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,在系统runloop的下一个周期自动调用layoutSubview
-layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局 所以你经常会看见下边两个方法连续调用的情况,setNeedsLayout是做标记,layoutIfNeeded是立即刷新视图layout,即调用layoutSubviews方法。
[self setNeedsLayout];
[self layoutIfNeeded];
但是有时候你会发现只单独调用 [selflayoutIfNeeded];了也立即刷新了,比如修改约束的constant属性, 那是因为当这样的约束被更新时,它会自动执行相当于setNeedsLayout的操作
有时候我们希望在点击某个按钮时某些约束实现动画,某些不实现动画,该如何实现?
在不希望实现动画的下面先调用一次layoutIfNeeded,让这些不想实现动画的代码先去执行,然后在希望执行动画的后边再在对应的animate方法中调用layoutIfneeded
-setNeedsDisplay方法:标记为需要重绘,异步调用drawRect
layoutSubviews方法调用先于drawRect,因为你要先把布局设置好才能开始画
sizeToFit会自动调用sizeThatFits方法;
sizeToFit不应该在子类中被重写,应该重写sizeThatFits
sizeThatFits传入的参数是receiver当前的size,返回一个适合的size
sizeToFit可以被手动直接调用sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己
前三个一般做动画会经常用到,这里有个swift的动画demo,可以看看
网友评论