【问题标题】:Draw string with alpha animation使用 alpha 动画绘制字符串
【发布时间】:2023-06-12 07:37:01
【问题描述】:

我在view 上画了一个string

string.draw(at: point withAttributes: attributes)

我想为字符串添加一些动画效果,基本上是 alpha 值 - 从 0 到 1 持续 1.0 秒。我将如何实现它?

【问题讨论】:

  • 您应该提供更多信息。您似乎正在绘制CGContext,您是否在该上下文中绘制了其他任何内容?您只想为淡入的文本设置动画吗?您使用的是UIKit 还是AppKit
  • 是的。我只将字符串绘制到CGContext。我正在使用UIKit
  • 每当请求重新绘制时都会绘制上下文。您可以使用DisplayLink 请求在每一帧重新绘制您的上下文并更新 alpha,但这对于您的需要来说太过分了。最简单的方法是将您的文本放在自己的 UILabel 上并为其设置动画。

标签: ios swift string cabasicanimation


【解决方案1】:

您可以使用CABasicAnimation 为视图layer 不透明度设置动画,即:

let view = // view rendering string

let animation = CABasicAnimation(keyPath: "opacity")
animation.fromValue = 0
animation.toValue = 1
animation.duration = 1

// add animation
view.layer.add(animation, key: "opacity")

// commit the final opacity value that will be used after animation completes
view.layer.opacity = 1

您可能还想使用CATextLayer 而不是在UIView.draw 中呈现字符串。在这种情况下,您将为文本层的opacity 设置动画。

let view = // view rendering string

let textLayer = CATextLayer()
textLayer.string = "my text"
textLayer.frame = view.layer.bounds

view.layer.addSublayer(textLayer)

【讨论】:

    【解决方案2】:

    对您要求的另一种理解:

    打字机效果文字动画

    一个接一个,

    • 显示的字符,alpha 1

    • 要显示的字符,alpha 0

    
    extension UILabel{
        func setTyping(text content: String, duration: TimeInterval = 5.0) {
          text = ""
          let dalay = duration / TimeInterval(content.count)
          let writingTask = DispatchWorkItem { [weak self] in
            guard let `self` = self else {return}
            content.forEach { char in
              DispatchQueue.main.async {
                self.text?.append(char)
              }
              Thread.sleep(forTimeInterval: dalay)
            }
          }
            
          let queue: DispatchQueue = .init(label: "typespeed", qos: .userInteractive)
          queue.asyncAfter(deadline: .now() + 0.05, execute: writingTask)
        }
    }
    
    

    【讨论】: