LoginSignup
3
1

More than 1 year has passed since last update.

【SwiftUI】タイピング風テキストアニメーションを作ってみた

Posted at

はじめに

ChatGPTはAIからの返答がタイピング風のアニメーションで返ってきます。
これをSwiftUIで再現できないかなと思い試してみました。

画面収録_2022-12-27_21_24_15_AdobeExpress

サンプルアプリ

ChatGPTの返答をそのまま表示してます
Simulator Screen Recording - iPhone 14 Pro - 2022-12-27 at 21 35 11

実装

ContentView
import SwiftUI

struct ContentView: View {
    @State var isStart: Bool = false
    private let input: String = """
            SwiftUIは、Appleが開発したiOS、macOS、watchOS、tvOSを対象とするUIフレームワークです。

            SwiftUIは、より簡単でスマートな方法でUIを構築することを目的としています。SwiftUIでは、UIを宣言的に記述し、プレビューでリアルタイムに表示されるため、デザインと実装を効率的に行うことができます。

            SwiftUIでは、画面を構成するUI要素(テキスト、画像、ボタンなど)を宣言するだけで、自動的にレイアウトが生成されます。また、SwiftUIでは、アプリケーションの自動更新機能を使用することで、データの変更が自動的にUIに反映されるようになります。

            SwiftUIでは、多数のプラットフォームをサポートするため、同じコードを使用して、iOS、macOS、watchOS、tvOSのアプリケーションを構築することができます。

            また、SwiftUIでは、Accessibility、Dark Mode、Localizationなどの機能も簡単に実装することができます。

            SwiftUIを使用することで、より効率的でスマートな方法でUIを構築することができるため、現在では非常に人気のあるUIフレームワークとなっています。
            """
    var body: some View {
        VStack {
            Button {
                isStart = true
            } label: {
                Text("スタート")
            }

            TypeWriterTextView(
                input,
                speed: 0.1,
                isStart: $isStart
            )
        }
        .padding()
    }
}
TypeWriterTextView
import SwiftUI

struct TypeWriterTextView: View {
    private let text: String

    private let speed: TimeInterval

    @Binding var isStart: Bool

    @State private var textArray: String = ""

    init(_ text: String, speed: TimeInterval = 0.1, isStart: Binding<Bool>) {
        self.text = text
        self.speed = speed
        self._isStart = isStart
    }

    var body: some View {
        Text(textArray)
            .onChange(of: isStart) { _ in
                startAnimation()
            }
    }

    private func startAnimation() {
        DispatchQueue.global().async {
            let _ = text.map {
                Thread.sleep(forTimeInterval: speed)
                textArray += $0.description
            }
        }
    }
}

おわり

ちゃんと使えるようになったらライブラリにでもしようかと思ってます

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1