使用不断变化的约束(进度条)为 imageView 设置动画 Swift

Animate an imageView with changing constraints (progress bar) Swift

因此,我正在创建一种进度条,主要是一个从 0% 到 100% 的动画。我有两张图片,一张在底部是红色的,一张在顶部是黑色的。我试图从顶部图像中拿走,以创建它正在从 0% 加载到 100% 的想法,慢慢显示下面的图像。我有所有这些工作,我的问题是我看不到两者之间。我看到 0% 和 100%,我可以调试它并查看控制器并看到我的视图控制器(自我)更新并慢慢拿走顶部图像所以我知道它正在工作但我没有看到它通过每个动画。我已经编辑了一个移动了很多东西但没能看到变化。提前感谢大家的帮助!

override func viewDidAppear(_ animated: Bool) {
    if intCounter <= 100{
        UIView.animate(withDuration: 0.05, animations: catScanE.layoutIfNeeded)
        repeat {
            dblImageH = dblImageH - 3.80
            self.catScanE.frame = CGRect(x: 27  , y: 197, width: 320, height: dblImageH)
            intCounter = intCounter + 1
        } while  (intCounter <= 100)
    } else {
        performSegue(withIdentifier: "lastSegue", sender: nil)
    }
}

我已经让动画基本正常工作,它向下滚动屏幕但显示一种动画。我希望它慢慢限制约束,但这不是现在的问题。由于动画 "works",我无法让它在动画之后继续,这就是我所拥有的。添加 if intCounter 部分使其跳过动画和 segue,没有它屏幕执行动画并坐在那里...

override func viewDidAppear(_ animated: Bool) {
            UIView.animate(withDuration: 5.0, animations: {
                self.dblImageH = self.dblImageH - 3.80
                self.catScanE.frame = CGRect(x: 27  , y: 197, width: 320, height: self.dblImageH)
                self.intCounter = self.intCounter + 1

                if self.intCounter > 100{
                    self.performSegue(withIdentifier: "lastSegue", sender: nil)}
            })

}

我在 Ravron 的帮助和更多 Whosebug 搜索的帮助下弄明白了。我在属性中将内容模式设置为顶部,并使用此代码使其表现得像一个进度条(这是一个黑色图像,下面有一个红色图像,看起来像是从 0 到 100)。我 运行 遇到图像基本上向上或向下移动的问题,这是通过更改 y 坐标以匹配大小变化来解决的,因此它基本上会保持在相同的位置。我只需要弄清楚如何使计数器在动画时从 0 变为 100。谢谢!希望这可以帮助其他人制作自定义进度条。

    override func viewDidAppear(_ animated: Bool) {

            UIView.animate(withDuration: 5.0, animations: {
                self.catScanE.frame = CGRect(x: 27  , y: 200, width: 320, height: 0)
            }, completion: {finished in self.performSegue(withIdentifier: "lastSegue", sender: nil)})
}

您的 animate 块只运行一次,视图框架的最终设置才是最重要的。视图实际上按照您的意愿从 0% 到 100% 进行动画处理,但它发生在 50 毫秒或大约三帧内。

只需将帧设置到动画块中所需的最终位置,并将持续时间增加到合理的程度,例如 100 * 0.05s = 5s

稍微扩展一下:animate 方法非正式地说,"run the block below, which changes one or more traits of various views. Then, implicitly animate those traits from their current values to the values set when the block was run." 所以它只被调用一次,您应该在其中将特征设置为所需的最终值。

考虑通读 the animations section of the View Programming Guide for iOS,它全面概述了平台上的动画基础知识,还涵盖了基于 UIView 块的动画,即您在此处尝试使用的类型。