Swift 只调用递归函数 X 次

Swift only call recursive function X times

我有一个函数可以用来为 4 UILabels 设置动画。动画是链接的,我试图通过创建一个接受标签作为参数的递归函数来减少重复代码,在完成时使用下一个标签调用自身。

   fileprivate func handleAnimations(firstLabel: UILabel, secondLabel: UILabel) -> Void {
        UIView.animate(withDuration: 1, delay: 2, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
            firstLabel.alpha = 1
        }) { (_) in
            UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
                secondLabel.alpha = 1
            }) { (_) in
                UIView.animate(withDuration: 0.5, delay: 3, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseInOut, animations: {
                    firstLabel.alpha = 0
                    secondLabel.alpha = 0
                }, completion: { (_) in
                    self.handleAnimations(firstLabel: self.introTextLabelThree, secondLabel: self.introTextLabelFour)
                })
            }
        }
    }

这是实现此目标的最佳方法吗?如果是这样,我如何防止最终的完整块用最后的 2 个标签一遍又一遍地调用自己?

我想达到的效果是:

labelOne - 淡入

labelTwo - 淡入

labelOne 和 labelTwo - 淡出

labelThree - 淡入

labelFour - 淡入

labelThree 和 labelFour - 淡出

在 labelThree 和 labelFour 之后,我希望实现另一个函数调用。

不要这样做。请使用 animateKeyframes。这将使您能够正确地链接动画,而不会出现可怕的厄运金字塔。

UIView.animateKeyframes(withDuration: 5.0, delay: 0, options: [.calculationModeCubic], animations: {
        // Add animations
        UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 1.0/6.0, animations: {
            self.introTextLabel.alpha = 1
        })
        UIView.addKeyframe(withRelativeStartTime: 1.0/6.0, relativeDuration: 1.0/5.0, animations: {
            self.introTextLabelTwo.alpha = 1
        })
        UIView.addKeyframe(withRelativeStartTime: 2.0/6.0, relativeDuration: 1.0/5.0, animations: {
            self.introTextLabel.alpha = 0
            self.introTextLabelTwo.alpha = 0
        })
        UIView.addKeyframe(withRelativeStartTime: 3.0/6.0, relativeDuration: 1.0/5.0, animations: {
            self.introTextLabelThree.alpha = 1
        })
        UIView.addKeyframe(withRelativeStartTime: 4.0/6.0, relativeDuration: 1.0/5.0, animations: {
            self.introTextLabelFour.alpha = 1
        })
        UIView.addKeyframe(withRelativeStartTime: 5.0/6.0, relativeDuration: 1.0/5.0, animations: {
            self.introTextLabelThree.alpha = 0
            self.introTextLabelFour.alpha = 0
        })
    }, completion:{ _ in
        // fire off whatever other method you want here
    })