UIView动画选项重复次数

4

我在处理Swift代码时遇到了一些问题,我正在尝试使UIImageView对象淡出并重新出现一次,但是遇到了只播放一次动画的问题。

@IBOutlet weak var ball: UIImageView!

@IBAction func onFadeClick(_ sender: Any) {
   UIView.animate(withDuration: 1, delay: 0.0, options: [.repeat, .autoreverse], animations: {
      self.ball.alpha = 0.0
      }, completion: nil)
}

我尝试阅读了文档和以前的问题,但是它们都提到要使用setAnimationRepeatCount, 但是xcode报错说它在iOS13中已经被弃用(也不起作用)。是否有任何内置函数可以在播放一次后停止动画?我在某处看到过使用回调函数并重新初始化动画,但我不确定如何做。还是使用UIViewPropertyAnimator而不是UIView.animate更好?

我刚开始学习Swift,任何帮助或指导都将不胜感激!

4个回答

6
您可以使用以下内容来实现您的目标:
UIView.animateKeyframes(withDuration: 2, delay: 0, options: [], animations: {
    UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5) {
         self.ball.alpha = 0.0
    }
    UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
         self.ball.alpha = 1
    }
}) { (isFinished) in

}

谢谢,它完全按照预期工作。但是,我确实不太理解其中的一些部分。我明白使用关键帧的想法,但是relativeDuration是什么意思?是关键帧所需的时间吗?如果是这样,所有关键帧的relativeDuration之和是否应该等于withDuration?而(isFinished)又代表什么呢?抱歉,看起来像是一堆问题! - Jon K
在这个例子中,动画持续时间设置为 2 秒。因此,相对持续时间是这段时间的一个分数。在这个例子中,0.5 将意味着 0.5 * 2s = 1s。相对起始时间也是一样。如果你将总体动画持续时间更改为 20 秒,则不必编辑每个子动画。 - CZ54

4

Swift 5.x

当前iOS语法替代已弃用的方法可以像下面的示例一样编写:

UIView.animate(withDuration:1, 
               delay: 0.5, 
               options: [.curveEaseInOut, .autoreverse, .repeat]) {
     UIView.modifyAnimations(withRepeatCount: 3, autoreverses: true) {
        print("repeated stuff")
     }
} completion: { _ in
     print("done")
}

3

谢谢,但是动画完成后球消失了,我需要球的alpha值恢复到1。我尝试在animate函数调用的某些部分设置alpha = 1,但似乎没有达到我想要的效果,我该怎么办? - Jon K

0

使用},而不是最后一个}):

}, completion: { finished in
    self.alpha = 1
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接