在标签中键入单词的动画.斯威夫特



我正在尝试在标签中键入动画单词。对于短文本,一切都很好,但如果我把它放长一点,它开始按单词的部分来写,而不是按一个字母来写。我的代码有什么问题?如何解决这个问题?

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

next in viewDidLoad我调用了func:

override func viewDidLoad() {
super.viewDidLoad()
Label.animate(newText: """
Здесь много текста.
""", characterDelay: 0.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)
}

我不知道这是对还是错,但它工作)

这个会像预期的那样工作

override func viewDidLoad() {
super.viewDidLoad()
Label.text = ""
var characterIndex = 0.0
let titleText = "Sometext"
for letter in titletexxt {
Timer.scheduledTimer(withTimeInterval: 0.1 * characterIndex, repeats: false) { timer in
self.Label.text?.append(letter)
}
characterIndex += 1
}
}

最新更新