swift - Swift 只调用递归函数 X 次
问题描述
我有一个用来为 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
})
推荐阅读
- javascript - 使用 colorByPoint 时如何设置系列的图例符号颜色?
- c# - UriBuilder 逃脱了 ? 到 %3F,但不是在每个应用程序中
- javascript - 尝试将 XML 转换为 JsTree 的 JSON (Javascript/Jquery)
- c++ - 在 C++ 谷物库中正确使用 CEREAL_REGISTER_DYNAMIC_INIT 问题
- swift - swift中DispatchQueue类型之间的区别
- timer - C++ 任务调度器
- php - 登录/注册想打印电子邮件
- angular - 角度 6 - 发送包含引号的字符串到组件输入
- c# - ASP.NET 核心在发布到文件夹并将其添加到 IIS 时默认主页/索引返回空白页
- linux - 在 Bash 中删除两个以 ~ 和 # 结尾的文件?