プログラミング

【Swift】UILabelを1文字ずつアニメーションで表示する

swift-eyecatch

UILabelを1文字ずつタイピングしているような感じでアニメーションする方法を紹介します。

CLTypingLabelを使うと、とても簡単に実装することができます。

CLTypingLabelを導入する

GitHub – cl7/CLTypingLabel: iOS UILabel with character by character typing /typewriter animation

CLTypingLabelは1ファイルのみで構成されています。CocoaPodを使っても良いですが、CLTypingLabel.swiftをそのままコピーしてプロジェクトに組み込んでも良いです。そのほうが手軽かと思います。

UILabelアニメーションの各種設定

CLTypingLabelUILabelを継承したクラスなので、UILabelと同じように使用することが可能です。

storyboardUILabelを設置したり、もしくはコードで実装して、CLTypingLabelインスタンスを作成します。

あとは、CLTypingLabelUILabelと同じようにtextを設定するだけでアニメーションされます。

UILabelアニメーションのスピード

アニメーションのスピードも簡単に設定することが可能です。

label.charInterval = 0.03

デフォルトは0.1に設定されているので、1秒で10文字と考えて良さそうです。それよりも早くアニメーションしたければ、上記のようにcharInterval0.1より小さい数値に設定します。

UILabelアニメーションのstart・pause・continue

アニメーションの開始は、textを設定したタイミングとなりますが、pausecontinueも可能です。

それぞれ、label.pauseTyping()label.continueTyping()と関数を呼ぶだけです。

AttributedTextにも対応

CLTypingLabelattributedTextにも対応しています。

label.attributedText = NSAttributedString(string: text)

非常にお手軽なので、試してみてください。

サンプルコード

import UIKit

class ViewController: UIViewController {

    private lazy var animationLabel: CLTypingLabel = {
        let label = CLTypingLabel()
        label.font = .systemFont(ofSize: 14, weight: .medium)
        label.charInterval = 0.03
        label.textAlignment = .center
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        // labelをviewにaddする
        view.addSubview(animationLabel)

        // labelにAutoLayoutをコードで設定(viewの真ん中に固定)
        [animationLabel.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
        animationLabel.centerXAnchor.constraint(equalTo: self.view.centerXAnchor)]
            .forEach { $0.isActive = true }

        // labelにtextを設定
        animationLabel.text = "Typing Animation"
    }
}

GitHub – cl7/CLTypingLabel: iOS UILabel with character by character typing /typewriter animation