Animate text change in UILabel

后端 未结 14 1254
[愿得一人]
[愿得一人] 2020-11-28 17:56

I\'m setting a new text value to a UILabel. Currently, the new text appears just fine. However, I\'d like to add some animation when the new text appears. I\

14条回答
  •  渐次进展
    2020-11-28 18:35

    There is one more solution to achieve this. It was described here. The idea is subclassing UILabel and overriding action(for:forKey:) function in the following way:

    class LabelWithAnimatedText: UILabel {
        override var text: String? {
            didSet {
                self.layer.setValue(self.text, forKey: "text")
            }
        }
    
        override func action(for layer: CALayer, forKey event: String) -> CAAction? {
            if event == "text" {
                if let action = self.action(for: layer, forKey: "backgroundColor") as? CAAnimation {
                    let transition = CATransition()
                    transition.type = kCATransitionFade
    
                    //CAMediatiming attributes
                    transition.beginTime = action.beginTime
                    transition.duration = action.duration
                    transition.speed = action.speed
                    transition.timeOffset = action.timeOffset
                    transition.repeatCount = action.repeatCount
                    transition.repeatDuration = action.repeatDuration
                    transition.autoreverses = action.autoreverses
                    transition.fillMode = action.fillMode
    
                    //CAAnimation attributes
                    transition.timingFunction = action.timingFunction
                    transition.delegate = action.delegate
    
                    return transition
                }
            }
            return super.action(for: layer, forKey: event)
        }
    }
    

    Usage examples:

    // do not forget to set the "Custom Class" IB-property to "LabelWithAnimatedText"
    // @IBOutlet weak var myLabel: LabelWithAnimatedText!
    // ...
    
    UIView.animate(withDuration: 0.5) {
        myLabel.text = "I am animated!"
    }
    
    myLabel.text = "I am not animated!"
    

提交回复
热议问题