浅谈layoutIfNeeded,setNeedsLayout的区别

layoutIfNeeded定义

如果当前布局更新处于等待中,强制刷新当前view所有子view,包括子view的subViews的布局等一直沿着图层树往下传递,重新调整所有子view的frame,如果当前布局没有任何变化,调用该方法会立即返回不做任何处理

setNeedLayout定义

使得当前布局无效,如果当前布局更新处于等待中,则会在下一次循环中触发布局更新

举个例子

  • 当更改view的某个子view的高度的时候添加layoutIfNeeded,约束会立即生效frame会立即改变:


    浅谈layoutIfNeeded,setNeedsLayout的区别_第1张图片
    图1

    浅谈layoutIfNeeded,setNeedsLayout的区别_第2张图片
    添加layoutIfNeeded()
  • 如果去掉layoutIfNeeded,frame并没有立即改变,而是在下次循环中才会变化


    浅谈layoutIfNeeded,setNeedsLayout的区别_第3张图片
    去除layoutIfNeeded()
  • 再例如,有时候我们想获取tableView在reloadData之后的contentSize,但是发现获取的是错误的,获取到的反而是reloadData之前的contentSize,其实也是由于在下一次循环中才会刷新contentSize。如果我们在reloadData之后追加layoutIfNeeded就会强制刷新布局,就能正确获取tableView.contentSize真实大小


    浅谈layoutIfNeeded,setNeedsLayout的区别_第4张图片
    contentSize正确获取方法
  • 动画更新约束,必须在动画更新的block里调用layoutIfneeded才会有动画,否则更新没有动画,立即跳变


    动画更新约束

你可能感兴趣的:(浅谈layoutIfNeeded,setNeedsLayout的区别)