layoutIfNeeded() 函数对 UIScrollView 的影响

在做 iOS 相关的约束动画时,我们一定会用到 layoutIfNeeded() 函数,但是在大多数情况下使用并没有什么问题。当与 UIScrollView 相关的控件结合使用的时候要注意了。

在开发一个 App 时(类似于浏览器的 App),需求是,滑动的时候,需要隐藏掉顶部的 navigation bar (这里我是用 UIView 自定义的一个 navigation bar)。向上滑动,让 navigation bar 移动到可视区域外消失,当然,移动的时候是有动画的,这里我用的是 constraint 相关的动画,所以我需要在最后调用一次 layoutIfNeeded() 函数。代码类似如下:

1
2
3
4
UIView.animate(withDuration: 0.35) {
// 进行更改约束的操作
self.view.layoutIfNeeded()
}

这时就出现问题了,滑动的时候,你想让滑动停止,当然是手指放在屏幕上,滑动就会立刻停止,不过在进行布局动画的时候,滑动将会继续,只有当动画完了的时候,视图才会响应你的点击事件。

为了避免上述的问题,建议使用 Core Graphics 来完成上述的动画效果,即:CGAffineTransform

使用 Core Graphics 完成动画,也能避免 layoutIfNeeded() 必须在父视图中调用这一要求的一些恶心的问题。