如何使 UIView 动画重新执行,而不是 .repeat in IOS (Swift)

How to make UIView animation re-execute, not .repeat in IOS (Swift)

我想扩展 UIView 以包含一个动画,该动画可以无限期地进行视图抖动(连续但随机旋转和平移距离)。

我尝试将以下扩展添加到 UIView:

func tremble() {

    UIView.animate(withDuration: 0.5, delay: 0, options: [.repeat, .autoreverse, .allowUserInteraction], animations: {
        var randomFromZeroToOne = CGFloat(Float(arc4random()) / Float(UINT32_MAX))
        let randomBool:Bool = arc4random_uniform(2) == 0
        if randomBool { randomFromZeroToOne = -randomFromZeroToOne }
        let degrees = randomFromZeroToOne / 5
        self.transform = CGAffineTransform(translationX: randomFromZeroToOne, y: randomFromZeroToOne)    
        self.transform = CGAffineTransform.init(rotationAngle: degrees)       
    }, completion: nil)
}

但我现在看到 .repeat 选项只是重复完全相同的动画(使用所有最初定义的 "random" 变量,它不会重新执行动画(使用每个变量创建新的随机变量执行)。

我怎样才能让它做我想做的事?我尝试了其他选项,例如 .beginFromCurrentState、.overrideInheritedOptions...

你可以试试这个

 func tremble() {

        var randomFromZeroToOne = CGFloat(Float(arc4random()) / Float(UINT32_MAX))
        let randomBool:Bool = arc4random_uniform(2) == 0
        if randomBool { randomFromZeroToOne = -randomFromZeroToOne }
        let degrees = randomFromZeroToOne / 5

    UIView.animate(withDuration: 0.5, delay: 0, options: [ .allowUserInteraction], animations: {
        self.transform = CGAffineTransform(translationX: randomFromZeroToOne, y: randomFromZeroToOne)    
        self.transform = CGAffineTransform.init(rotationAngle: degrees)       
    }, completion: {
        self.tremble()
    })
}