视图可能需要随时间而更改内容。 他们可能会从一个图像转换到另一个图像,或提供一系列视觉更新来指示应用程序状态。 动画通过一个特殊的定时器类满足绘画。
CADisplayLink
类为视图动画提供了一个定时器对象。 它触发刷新时钟同步到显示器的刷新率。 这使您可以在时钟上重绘视图。 您可以使用此时钟来生成基于Quartz的动画效果,如行进蚂蚁或将基于Core Image的转换添加到您的界面。 Display links是QuartzCore框架的一部分。 您创建这些计时器并将其与运行循环相关联。
虽然您可以使用NSTimer
来获得类似的结果,但使用display link可以让您获得更准确的刷新间隔。 更重要的是,display link可以更好地保证计时器的准确性(它会及时启动)。 苹果在文档中写道:
定时器触发的实际时间可能是预定的发射时间之后的相当长的一段时间。
示例7-3显示了如何创建display link。 您应该使用常用的模式(NSRunLoopCommonModes)来降低延迟。 在此示例中,目标是一个视图,并且被触发的选择器是setNeedsDisplay
,系统提供的UIView
的方法。 触发时,此目标选择器对会指示系统将该视图的整个边界标记为过时的(失效的),并请求drawRect:
在下一个绘图周期重画。drawRect:
方法使用Quartz和iOS绘图API手动绘制自定义视图的内容。
示例7-3创建Display Link
1 | CADisplayLink *link = [CADisplayLink |
Display Link的帧间隔是控制其刷新率的属性。 通常默认为1。为1时,每次链接定时器触发时,display link通知目标。 这会导致更新率与显示器的刷新率相匹配。 要调整此值,请更改display link的整数frameInterval
属性。 数字越高刷新率越低。 将其设置为2将您的帧速率减半,等等:
link.frameInterval = 2;
假设没有处理瓶颈,良好的系统运行速度为每秒60帧(fps)。 您可以使用Instruments中的Core Animation分析器(参见图7-7)来测试刷新率,同时在帧间隔设置为1的设备上运行应用程序。这样,您可以了解在您的应用程序运行动画绘图任务过程中有多少负担(子任务) 。 如果您看到刷新率下降到例如12 fps或3 fps或更少,则需要认真重新思考如何执行绘图任务。
图7-7在Instruments中运行的核心动画模板。
Note
Instruments在通过分析iOS应用程序在引擎盖(hood)下的工作情况来确保应用程序高效运行方面发挥了关键作用。 该实用程序采样内存使用(情况)并监视性能。 这可以让您识别和定位应用程序中的问题区域,并在打包发布应用程序之前对其效率进行处理。
Instruments提供图形化的基于时间的性能图,显示应用程序使用最多资源的位置。Instruments是由Sun Microsystems开发的开源DTrace软件包构建的。
在Xcode 5中,Debug Navigator可让您在应用程序运行时跟踪CPU和内存负载。
完成显示循环后,使display link失效(使用invalidate
)。 这将从运行循环中删除它,并将目标/动作分离:
[link invalidate];
或者,您可以将display link的paused属性设置为YES,然后暂停display link,直到需要再次(启动)。
本文翻译自《iOS Drawing Practical UIKit Solutions》作者:Erica Sadun,翻译:Cheng Dong。如果觉得本书不错请购买支持正版:亚马逊购买传送门,本书所有源代码可在GitHub上下载。译者虽然力求做到信,达,雅,但是由于时间仓促加之译者水平十分有限,文中难免会出现不正确,不准确,词不达意,难于理解的地方,还望各位批评指正,共同进步,谢谢。转载请注明出处。