简体   繁体   English

在 Swift 中链接动画

[英]Chaining Animations in Swift

Recently, I have made some code which draws a face.最近,我做了一些画脸的代码。 I wanted to animate the face to shake back and forth.我想让脸动画来回摇晃。 Currently I have this code.目前我有这段代码。 It rotates once to the right, then more to the left, and then to the original position. However, what if I wanted the head to infinitely shake back and forth(rotate bath and forth).它向右旋转一次,然后向左旋转一次,然后到原来的 position。但是,如果我想让头部来回无限摇晃(来回旋转 bath)怎么办? Is it possible to make some sort of recursive function to do this?是否可以使用某种递归 function 来执行此操作?

@IBAction func shakeHead(_ sender: UITapGestureRecognizer) {

    UIView.animate(
        withDuration: 0.5,
        animations: {
            self.faceView.transform = self.faceView.transform.rotated(by: self.shakeAngle)
    },
        completion:{ finished in
            if(finished){
                UIView.animate(
                    withDuration: 0.5,
                    animations: {
                        self.faceView.transform = self.faceView.transform.rotated(by: -(self.shakeAngle)*2)
                },
                    completion:{ finished in
                        if(finished){
                            UIView.animate(
                                withDuration: 0.5,
                                animations: {
                                    self.faceView.transform = self.faceView.transform.rotated(by: self.shakeAngle)
                            },
                                completion: nil
                            )
                        }
                }
                )
            }
    }
    )

}

You could call shakeHead from the final completion block.你可以从最后的完成块调用shakeHead

@IBAction func shakeHead(_ sender: UITapGestureRecognizer) {

    UIView.animate(
        withDuration: 0.5,
        animations: {
            self.faceView.transform = self.faceView.transform.rotated(by: self.shakeAngle)
    },
        completion:{ finished in
            if(finished){
                UIView.animate(
                    withDuration: 0.5,
                    animations: {
                        self.faceView.transform = self.faceView.transform.rotated(by: -(self.shakeAngle)*2)
                },
                    completion:{ finished in
                        if(finished){
                            UIView.animate(
                                withDuration: 0.5,
                                animations: {
                                    self.faceView.transform = self.faceView.transform.rotated(by: self.shakeAngle)
                            },
                                completion: { finished in
                                    shakeHead(sender)
                            }
                            )
                        }
                }
                )
            }
    }
    )
}

Even though this is technically a recursive call, it's not a problem due to the asynchronous nature of the code.尽管这在技术上是递归调用,但由于代码的异步性质,这不是问题。

Use animateKeyframes for a better chain animation experience使用animateKeyframes获得更好的连锁体验 animation

@IBAction func shakeHead(_ sender: UITapGestureRecognizer) {
        UIView.animateKeyframes(withDuration: animationDuration, delay: 0, options: [], animations: {
            UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5) {
                self.faceView.transform = self.faceView.transform.rotated(by: self.shakeAngle)
            }
            
            UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
                self.faceView.transform = self.faceView.transform.rotated(by: -(self.shakeAngle)*2)
            }
            
            
            UIView.addKeyframe(withRelativeStartTime: 1.0, relativeDuration: 0.5) {
                self.faceView.transform = self.faceView.transform.rotated(by: self.shakeAngle)
            }
            
        }) { (isFinished) in
            shakeHead(sender)
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM