如何在没有计时器的情况下播放核心动画时自动更新 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 编写的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...