ios动画原理 modelLayer和presentationLayer以及点击交互

本文深入探讨了iOS动画中modelLayer和presentationLayer的区别,以及在动画过程中如何处理点击交互。在动画执行时,view的frame只在动画结束时改变,而presentationLayer则在每一帧中反映动画状态。通过CADisplayLink和KVO监听,揭示了view和layer在动画过程中的变化。此外,讲解了如何通过hitTest方法在动画中响应用户交互,强调了presentationLayer在处理点击事件中的作用。最后,对比了CoreAnimation动画和非CoreAnimation动画的实现方式,强调了CoreAnimation的高效性能。

ios动画原理 modelLayer和presentationLayer以及点击交互

我们知道,iOS的动画,和其对应的layer有关。

之前在开发的过程中碰到一个问题,那就是,在一个视图的动画过程中,这个视图view和Layer的frame是怎么变化的?

1 动画过程中frame的变化

为了研究动画过程中,view和Layer的frame变化,做了简单的动画打印测试,效果如下:

image.png

由结果可知,在UIView动画的回调中添加打印,只会打印一次,且打印的是最终的view和Layer 的位置,这显然不是想要的结果,所以,在动画的回调block中打印是不能实现的;

1.1 添加KVO监听frame的变化

在动画之前,对视图view和layer分别添加kvo监听其frame的变化,看是否能在动画过程中,视图的frame发生变化,从而打印出对应的frame:

image.png

如上图打印结果,添加kvo监听,对应的view和layer,只监听到了修改view的一次frame的变化,添加断点,监听的回调也只走一次;

??问题:
1.view的frame变化为什么只有一次?动画的过程中,view的frame不变?
2.为什么监听不到layer 的frame的变化? 最终通过第一次的实验,layer的frame是发生了变化的啊?

1.2 添加CADisplayLink 打印frame的变化

带着1.1中的两个问题,回想到view动画的实现原理,动画的过程其实是一帧一帧显示的,所以,每一帧对应的view或者layer的位置是不断变化的;

所以应该尝试打印在每一帧的显示时,view和layer的frame;

而这恰好可以使用系统自带的CADisplayLink,它的回调频率,和设备的刷帧是一致的,添加测试如下:
image.png

注意:添加一个dispatch_after,是为了避免一直打印,不方便查看打印结果,没有其他作用;

打印发现,view和layer的frame还是每次打印的最终位置的frame;

由此,证明了动画过程

view的frame只改变的一次,直接改到了最终的frame

而动画的view的layer,确实是和动画相关的,难道它的frame也只改变了一次?

2 关于modelLayer和presentationLayer

打开CALayer的头文件,发现了其下两个属性:


/* Returns a copy of the layer containing all properties as they were
 * at the start of the current transaction, with any active animations
 * applied. This gives a close approximation to the version of the layer
 * that is currently displayed. Returns nil if the layer has not yet
 * been committed.
 *
 * The effect of attempting to modify the returned layer in any way is
 * undefined.
 *
 * The `sublayers', `mask' and `superlayer' properties of the returned
 * layer return the presentation versions of these properties. This
 * carries through to read-only layer methods. E.g., calling -hitTest:
 * on the result of the -presentationLayer will query the presentation
 * values of the layer tree. */

 / *-presentationLayer方法的结果上调用时,返回
 *具有当前模型值的基础层。当调用
 *非表示层,返回接收者。通话结果
 *产生展示的交易后的此方法
 *图层已完成是不确定的。 * /


/ *返回包含所有属性的图层的副本
 *在当前交易开始时,带有任何活动的动画
 *适用。这非常接近该图层的版本
 *当前显示。如果图层尚未返回nil
 *已承诺。
 *
 *尝试以任何方式修改返回的图层的效果是
 *未定义。
 *
 *返回的`sublayers',`mask'和`superlayer'属性
 *层返回这些属性的表示形式。这个
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值