iOS 仿直播间弹出评论功能 动画实现遇到的坑

695 阅读3分钟

功能描述:
仿抖音视频播放页面,中间为视频播放器,播放器下方动画形式弹出评论和点赞用户头像,并实现动画上移的效果

实现思路:
使用一个容器contentView,内部加载n个自定义View作为cell,来循环使用,避免不断的创建对象和动画结束后移除对象造成的内存浪费.

遇到的问题:
当contentView里的cell被改变frame时,或者上移动画结束后被移除,然后重新addSubview时,会触发layoutSubviews重新计算布局,导致在动画中的cell的动画被打断和取消

补充:
layoutSubviews在以下情况下会被调用:
1、init初始化不会触发layoutSubviews
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

解决方案:
使用n个容器contentView,他们的frame一样,每个contentView仅加载1个自定义View作为cell,每次动画结束时,cell的frame改变只会触发其容器contentView的layoutSubviews,不会对别的cell的动画造成影响。

其他问题(稍后研究):
动画过程中,点击不响应问题
动画分显式隐式动画,显式和隐式动画的区别:
1、隐式动画一直存在 如需关闭需设置;显式动画是不存在,如需显式 要开启(创建)。

2、显式动画是指用户自己通过beginAnimations:context:和commitAnimations创建的动画。 隐式动画是指通过UIView的animateWithDuration:animations:方法创建的动画。

3、隐式动画是系统框架自动完成的。Core Animation在每个runloop周期中自动开始一次新的事务,即使你不显式的用[CATransaction begin]开始一次事务,任何在一次runloop循环中属性的改变都会被集中起来,然后做一次0.25秒的动画。在iOS4中,苹果对UIView添加了一种基于block的动画方法:+animateWithDuration:animations:。这样写对做一堆的属性动画在语法上会更加简单,但实质上它们都是在做同样的事情。CATransaction的+begin和+commit方法在+animateWithDuration:animations:内部自动调用,这样block中所有属性的改变都会被事务所包含。

4、显式动画,Core Animation提供的显式动画类型,既可以直接对退曾属性做动画,也可以覆盖默认的图层行为。我们经常使用的CABasicAnimation,CAKeyframeAnimation,CATransitionAnimation,CAAnimationGroup等都是显式动画类型,这些CAAnimation类型可以直接提交到CALayer上。 无论是隐式动画还是显式动画,提交到layer后,经过一系列处理,最后都经过上文描述的绘制过程最终被渲染出来。

参考链接:www.jianshu.com/p/31949f943…