【问题标题】:Animation typing words in label. Swift动画在标签中键入单词。迅速
【发布时间】: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 的信息,现在我对并发有了更多的了解!

标签: ios swift animation label


【解决方案1】:

寻找另一个答案:

extension UILabel {
    func animation(typing value: String, duration: Double){
        for char in value {
            self.text?.append(char)
            RunLoop.current.run(until: Date() + duration)
        }
    }
}

并在 viewDidAppear 中调用,而不是在 viewDidLoad 中调用

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    Label.text = ""
    Label.animation(typing: "Здесь много всякого разного текста.", duration: 0.1)
}

我不知道它是否正确,但它有效)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2023-03-16
    • 2021-01-07
    • 2016-05-27
    相关资源
    最近更新 更多