【发布时间】:2021-01-23 06:56:51
【问题描述】:
我正在尝试在标签中制作动画键入单词。用短文本一切都很好,但如果我放长一点,它会开始按单词的一部分而不是一个字母来写。我的代码有什么问题?以及如何解决?
extension UILabel {
func animate(newText: String, characterDelay: TimeInterval) {
DispatchQueue.main.async {
self.text = ""
for (index, character) in newText.enumerated() {
DispatchQueue.main.asyncAfter(deadline: .now() + characterDelay * Double(index)) {
self.text?.append(character)
self.fadeTransition(0.2)
}
}
}
}
}
extension UIView {
func fadeTransition(_ duration:CFTimeInterval) {
let animation = CATransition()
animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
animation.type = CATransitionType.fade
animation.duration = duration
layer.add(animation, forKey: CATransitionType.fade.rawValue)
}
}
viewDidLoad 中的下一个我调用了 func:
override func viewDidLoad() {
super.viewDidLoad()
Label.animate(newText: """
Здесь много текста.
""", characterDelay: 0.1)
}
【问题讨论】:
-
我也遇到过同样的问题,解决方法叫 DispatchWorkItem
-
问题在于定时器合并,作为省电功能的一部分,计划在 10% 范围内的事件被合并在一起运行。但与其解决这个问题(使用“严格”的调度功能),我建议根本不要使用这种模式。改用重复的
Timer,让每个呼叫添加另一个字母。例如,如果你不得不关闭你的视图,定时器很容易失效,但是如果你安排了一堆 GCD 项目运行,那么你就会一团糟地跟踪所有这些项目,取消它们等等。跨度> -
谢谢你们!你的回答帮助我了解更多关于 GCD 的信息,现在我对并发有了更多的了解!