我想将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选项只是重复完全相同的动画(带有所有最初定义的“随机”变量,并且它不重新执行动画(每次执行都创建新的随机变量))。

我怎样才能让它做我想要的?我尝试了其他选项,例如.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()
    })
}

10-07 19:13
查看更多