问题: 一个Button正在执行CoreAnimation平移动画过程中是否能被点击? 点击是否能被触发? 为什么? 如何解决?


当前View在动画的过程中点击是不能被响应的,但是我们可以在原始位置点击触发事件.或者在父视图添加触摸事件监控Button的presentationLayer的位置来触发点击事件.

这是因为CoreAnimation的底层原理导致的,CoreAnimation核心动画的底层原理就不得不说两个重要的Layer. 一个是 presentationLayer,另外一个是 modelLayer.

我们都知道,UIView持有一个CALayer.两者分工明确,UIView主要是用来负责用户交互事务的主体,CALayer主要是用来负责渲染工作的主体,而CALayer底下一共含有两个Layer,一个就是 presentationLayer,另外一个则是 modelLayer. 整体结构如下图所示.

这里就要说一下presentationLayermodelLayer的分工了,presentationLayer其实就是我们看到的展现到屏幕上的视图layer, modelLayer则是管理渲染数据Layer,像我们平常设置frame,color等渲染数据其实并不是直接设置到presentationLayer上,而是设置在modelLayer上.当垂直同步信号来临时,presentationLayer需要渲染的时候,就会去modelLayer中获取渲染数据,然后再进行绘制.所以虽然两者并不是完全同步的,但是肉眼是观测不到的.

上面我们了解了presentationLayermodelLayer的分工,但他俩平常配合工作是完全没有任何问题,但是当 addAnimation: 添加核心动画时,这时候给 presentationLayer 提供数据的就不再是 modelLayer 了.而是CAAnimation. 这是我们就能在设置的时间段内看到视图的动画过程了.

但是当动画结束的时候,如果没有任何设置,那么presentationLayer需要的渲染数据依然通过modelLayer获取这时候依然会回到起始位置,这也就是为什么CoreAnination动画在结束时就回到起始位置了.

那么为什么Button在动画过程中无法被响应呢?其实就是响应者链获取的Frame其实是通过modelLayer获取的,所有presentationLayer动画过程中并不能被响应,但是动画过程中起始位置可以被响应.


问题: 简述一下UIView动画与CoreAnimation动画的区别.


UIView动画是隐式动画,视图在动画的过程中无法被响应.

CoreAnimation动画是显式动画,视图在动画的过程中无法被响应.


IT界无底坑洞栋主 欢迎加Q骚扰:676758285