微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在没有计时器的情况下播放核心动画时自动更新 UISlider 的值

如何解决如何在没有计时器的情况下播放核心动画时自动更新 UISlider 的值

我已经使用 40 张图像创建了核心动画(每张图像在 CALayer 中正好停留 3 秒)。
总持续时间 = 120 秒。每张照片都在 CABasicAnimation(keypath : "position.x") 的帮助下从左向右移动。现在我有一个 UiSlider。我想在 CALayer 中播放核心动画时自动更新滑块的值。我使用 Timer 更新滑块的值,如下所示
time = Timer.scheduledTimer(timeInterval: 1,target: self,selector: #selector(self.updateSlideValue),userInfo: nil,repeats: true)

动画代码


let blackLayer = CALayer()
 blackLayer.frame = CGRect(x: -viewSize.width,y: 0,width: viewSize.width,height: viewSize.height)
 let imageLayer = CALayer()
imageLayer.frame = CGRect(x: 0,height: viewSize.height)
imageLayer.contents = nextPhoto?.cgImage
blackLayer.addSublayer(imageLayer)

let animation = CABasicAnimation()
animation.keyPath = "position.x"
animation.fromValue = -viewSize.width
animation.tovalue =  (viewSize.width)/2
animation.duration = self.perImageLife
animation.speed = 1 // 1 is default actually
animation.beginTime = CACurrentMediaTime() + animationTimes[index-1] // animationTimes is an array like [0,3,6,9,.....]

animation.fillMode = camediatimingFillMode.forwards
animation.isRemovedOnCompletion = false
animation.delegate = self
blackLayer.add(animation,forKey: "basic")          
parentLayer.addSublayer(blackLayer)

但使用定时器进行更新并不是一个更好的主意。核心动画在没有定时器的情况下运行时如何自动更新滑块的值?

这是我的项目的一个小录制视频。 https://drive.google.com/file/d/1SjaWJM_FEWp1TyR7fpQt8_IZdme_I2Vc/view?usp=sharing

A photo which animated from left to right and slider's value updated using Timer.

解决方法

我认为您无法观察您正在设置动画的属性并使用这些变化的值来更新滑块位置。您必须使用计时器在每次更改帧时更新滑块值。

您是否打算让用户能够拖动滑块上的“拇指”来来回滑动动画?这是问题的另一层复杂性。

如果这是您的意图,我建议您使用 UIViewPropertyAnimator 而不是 CAAnimation。暂停/恢复/清理 CAAnimation 很棘手,而且没有很好的文档记录。我过去已经解决了这个问题,所以如果你决定走那条路,我可以挖掘一些旧的示例代码(可能是用 Objective-C 编写的)并尝试引导你完成它。

这个 project on Github(从 7 年前开始!)实现了基于 UIView 和 CAAnimation 的动画,其中包括显示进度和可以来回滑动的滑块。

然而,它早于 UIViewPropertyAnimator。刚出的时候我也写了很多simpler demo of UIViewPropertyAnimator。不过,它可能是为旧版本的 Swift 编写的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。