在 Swift 中链接动画



最近,我做了一些画脸的代码。我想让脸部来回摇晃。目前我有这个代码。它向右旋转一次,然后向左旋转一次,然后旋转到原始位置。但是,如果我想让头部无限来回摇晃(旋转浴缸和来回)怎么办?是否可以制作某种递归函数来执行此操作?

@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
                            )
                        }
                }
                )
            }
    }
    )
}

您可以从最终完成块调用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)
                            }
                            )
                        }
                }
                )
            }
    }
    )
}

尽管这在技术上是一个递归调用,但由于代码的异步性质,这不是问题。

使用 animateKeyframes 获得更好的链动画体验

@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)
        }
    }

最新更新