【问题标题】:Control of UIView animations for swift快速控制 UIView 动画
【发布时间】:2024-04-14 18:00:01
【问题描述】:

我正在使用 UIView 动画功能测试一些东西,我对您对动画缺乏控制感到有些困惑。也许我错过了什么

          UIView.animate(
            withDuration: TimeInterval(Int.random(in: 20 ..< 25)),
            delay: TimeInterval(cloudConfig.delay),
            options: [
                UIView.AnimationOptions.curveLinear,
                UIView.AnimationOptions.repeat,
            ],
            animations: {
                self.view.transform = CGAffineTransform(translationX: width, y: 0)
                self.parent!.layoutIfNeeded() // important for the animation
            },
            completion: { _ in
                print("hurray I know when it ends, if it would fire on repeat as well :) it does not")
            }
        )

此动画只是将视图从左向右移动并重复该过程。我似乎无法在 api 中找到任何可以让我寻找动画的特定时间并从那里开始的东西。或者简单的事情,比如暂停和播放,或者获取当前的播放位置。有没有办法对动画进行一些控制,它几乎就像 css 动画 - 零控制。

感谢任何提示

【问题讨论】:

标签: swift animation uiview uiviewanimation


【解决方案1】:

您正在使用的 UIView 类函数 UIView.animate(withDuration:delay:options:animations:completion:) 不会为您提供您所询问的任何事情(在动画中寻找特定时间、暂停/恢复、获取当前动画位置的能力。)

也就是说,不同的UIView.animate() 函数通过创建CABasicAnimation 动画并在视图层上运行它们来工作。可以使用UIView.animate() 函数之一创建动画,然后进入生成的图层动画并执行您描述的操作。它没有很好的记录,令人困惑和挑剔,但它是可能的。我在 2015 年写了一篇博文,展示了如何做这些事情(在 Objective-C 中)http://wareto.com/keyframe-view-animations

该帖子的代码可以在https://github.com/DuncanMC/KeyframeViewAnimations找到

您可以通过操作图层的 speed、beginTime 和 timeoffset 属性来暂停、恢复或前后擦洗图层动画。

我已经好几年没看过那个代码了,也没有尝试用 Swift 重写它,但如果你想弄清楚如何去做,它确实可以作为一个路线图。 (请注意,这很复杂而且很繁琐。)

正如 TeeJaay 所提到的,有一个更新的动画类 UIViewPropertyAnimator,它确实支持暂停和恢复动画、将它们擦洗到特定点等功能。如果您需要这些功能,我建议您看看。你应该可以在网上找到它的教程。

【讨论】:

    最近更新 更多