CADisplayLink

先说两个实际情况小例子:我们在用音乐播放器类app的时候 通常会发现 当我们退出程序的时候 音乐是渐进消失的  当时第一次发现是在QQ音乐的使用  按下home键程序退到后台随之音乐音量也会慢慢变低直至静音。

还有就是文字的渐变出现和渐变隐藏

其实很大一部分都是我们今天的主角CADisplayLink起得作用  其实也可以用NSTimer但是效果没有前者好。那么我们就引出了CADisplayLink其实适合NSTimer类似的效果。但是区别是CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和selector 在屏幕刷新的时候调用。

也就是都是可以用于定时器 但是精确程度不一样:

iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。
NSTimer的精确度就显得低了点,比如NSTimer的触发时间到的时候,runloop如果在阻塞状态,触发时间就会推迟到下一个runloop周期。并且 NSTimer新增了tolerance属性,让用户可以设置可以容忍的触发的时间的延迟范围。
CADisplayLink使用场合相对专一,适合做UI的不停重绘,比如自定义动画引擎或者视频播放的渲染。NSTimer的使用范围要广泛的多,各种需要单次或者循环定时处理的任务都可以使用。在UI相关的动画或者显示内容使用 CADisplayLink比起用NSTimer的好处就是我们不需要在格外关心屏幕的刷新频率了,因为它本身就是跟屏幕刷新同步的。

我们知道动画效果就是一个属性的线性变化,比如UIView 动画的 EasyIn EasyOut 。通过数值按照不同速率的变化我们能生成更接近真实世界的动画效果。我们也可以利用这个特性来使一些其他属性按照我们期望的曲线变化。比如当播放视频时关掉视频的声音我可以通过CADisplayLink来实现一个 EasyOut的渐出效果:先快速的降低音量,在慢慢的渐变到静音。

原文地址:https://www.cnblogs.com/wangxiaoqi/p/6474025.html