ios – Swift中自定义属性的隐式CALayer动画

ios – Swift中自定义属性的隐式CALayer动画,第1张

概述我使用PaintCode创建了一个可动画的Core Graphics绘图.它基本上是一个圆形表(与Apple Watch戒指不同),它基本上会在计时器倒计时时填满. meterLevel控制圆形仪表的填充水平,从0到100.基本上,如果计时器设置为10秒,我将meterLevel每1秒设置为90,80,70等… 这很好用,但是动画只画1秒钟,看起来很不稳定.相反,我希望它是一个平滑的连续灌装仪表. 我使用PaintCode创建了一个可动画的Core Graphics绘图.它基本上是一个圆形表(与Apple Watch戒指不同),它基本上会在计时器倒计时时填满. meterLevel控制圆形仪表的填充水平,从0到100.基本上,如果计时器设置为10秒,我将meterLevel每1秒设置为90,80,70等…

这很好用,但是动画只画1秒钟,看起来很不稳定.相反,我希望它是一个平滑的连续灌装仪表.

环顾四周似乎是继承CALayer并为meterLevel属性创建一个隐式动画可能就是这样.所以这就是我所拥有的:

import UIKitclass MeterControlVIEw: UIVIEw{var meterLevel: Int = 0 {    dIDSet {        self.layer.setValue(meterLevel,forKey: "meterLevel")    }}var meterText: String = "00:00:00" {    dIDSet {        self.layer.setValue(meterText,forKey: "meterText")    }}overrIDe class func layerClass() -> AnyClass {    return MeterControlLayer.self}overrIDe func drawRect(rect: CGRect) {    // Do nothing    }}class MeterControlLayer: CALayer{@NSManagedvar meterLevel: Intvar meterText: String = "00:00:00"overrIDe class func needsdisplayForKey(key: String) -> Bool {    if (key == "meterLevel") {        return true    }    return super.needsdisplayForKey(key)}overrIDe func actionForKey(key: String) -> CAAction? {    if (key == "meterLevel") {        let anim: CABasicAnimation = CABasicAnimation.init(keyPath: key)        anim.fromValue = self.presentationLayer()?.meterLevel        anim.duration = 1.0        return anim    } else {        return super.actionForKey(key)    }}overrIDe func drawInContext(ctx: CGContext) {    super.drawInContext(ctx)    UIGraphicsPushContext(ctx)    XntervalStyleKit.drawMeterControl(frame: self.bounds,meterTime: meterText,meterLevelValue: CGfloat(meterLevel))    UIGraphicsPopContext()    }}

遗憾的是,这并不像我期望的那样完美.动画仍然有点不稳定,虽然更接近我想要的.

我的问题更为笼统,这是完成我想做的事情的正确方法吗?我无法找到设置图层属性meterLevel和meterText的正确方法,而不使用setValueForKey:.这是正确的方法吗?

动画/图形对我来说绝对是新手.我是一个嵌入式C软件,试图将iOS开发作为一种业余爱好.

解决方法

The animation is still a bit choppy,though closer to what I want.

鉴于此,似乎Core Animation实际上每帧都在绘制您的图层(或者尝试,无论如何).

不幸的是,一旦你对每一帧执行自定义图层绘制,你的性能就会变成主线程:通常,对于Core Animation本身可以动画化的属性(例如边界),动画本身会在渲染服务器中呈现,从您的应用程序进行进程外处理,并拥有自己的高优先级渲染线程.应用程序的主线程可以在这些动画类型中随意执行任何 *** 作,而不会中断动画.

但是,drawInContext(_ :)在应用程序的主线程上调用.如果你在那里放一个日志语句或断点,它是否会在动画持续时间内多次调用?如果是这样,那么图层就是正确的动画.你在这个函数中的绘图 *** 作可能是阻碍动画的.

尝试在图层上将drawAsynchronously设置为true.这将绘图命令推迟到后台线程,有时可以提高性能. (请注意,大多数(如果不是全部)UIGraphics和Core Graphics功能在iOS 4中都是线程安全的,因此背景绘图是安全的.)

此外,根据动画的复杂程度,您可能需要提前绘制几个中间表示(如果可能,在背景中并行绘制).如果它们不是太大,请将它们存储在内存中,这样您只需在图层中显示一些这些位图,而不是及时绘制它们.

总结

以上是内存溢出为你收集整理的ios – Swift中自定义属性的隐式CALayer动画全部内容,希望文章能够帮你解决ios – Swift中自定义属性的隐式CALayer动画所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1003764.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存