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

Posted

技术标签:

【中文标题】在没有 Timer 的情况下播放核心动画时如何自动更新 UISlider 的值【英文标题】:How to update UISlider's value automatically when core animation is playing without Timer 【发布时间】:2021-05-13 17:11:28 【问题描述】:

我使用 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, y: 0, width: viewSize.width, 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)

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

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

【问题讨论】:

你能分享你的动画代码吗?您当然可以在图像动画旁边为 UISlider 值设置动画。 感谢您的快速响应。我添加了动画代码。请再次检查。并帮助我。 @CSmith 如果您的动画继续,那么您可以使用 CADisplayLink :developer.apple.com/documentation/quartzcore/cadisplaylink 【参考方案1】:

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

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

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

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

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

【讨论】:

是的。我打算让用户能够拖动滑块上的“拇指”来来回滑动动画。我已经使用 CAAnimation 做到了。但是当我向前和向后移动滑块时它正在工作。但是滑块的值不会在不触摸的情况下自动更新。您可以共享旧的示例代码。这会很有帮助。 谢谢。我去看看。 有没有什么方法可以在没有 Timer 的情况下自动更新滑块的值? 不,我认为没有。

以上是关于在没有 Timer 的情况下播放核心动画时如何自动更新 UISlider 的值的主要内容,如果未能解决你的问题,请参考以下文章

在没有获得任何权限的情况下在网站上自动播放音乐。

Microsoft office2007 ppt如何设置手动播放和自动播放

在没有用户交互的情况下播放波纹动画

chromecast 自定义接收器 - 播放列表在没有“onLoad”动画的情况下推进媒体

如何在不重复Unity动画的情况下通过Animator提高动画播放速度

故事板 - 如何在没有动画和显示屏幕的情况下自动执行转场