1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SwiftUI】長文の文字列をTextで表示する際にHangする問題の対処法

Last updated at Posted at 2024-10-16

問題

SwiftUIでの開発で必ず使用するTextですが、非常に長い文字列を表示することはあまり想定されていないようです(T_T)
実際にNavigationLinkによる遷移先にScrollViewでラップされたTextを用意して、10000文字程度の日本語の文字列を表示する様子をInstrumentsで確認すると、遷移する直前に画面が固まってしまいます。

    var body: some View {
        NavigationStack {
            NavigationLink(destination: ScrollView{Text("ここに非常に長いテキスト")}) {
                Text("Link")
            }
        }
    }

スクリーンショット 2024-10-16 13.29.44.png

解決策

文字列を改行で区切り、LazyVStackを使用して縦に重ねることで、表示パフォーマンスが改善されました。

import SwiftUI

struct LazyText: View {
    let text: String
    private let lines: [String]

    init(_ text: String) {
        self.text = text
        self.lines = text.components(separatedBy: .newlines)
    }

    var body: some View {
        ScrollView {
            LazyVStack(alignment: .leading, spacing: 0) {
                ForEach(Array(lines.enumerated()), id: \.offset) { _, line in
                    Text(line)
                }
            }
        }
    }
}

使用例

 let sampleText = """
        これは長い長いテキストのサンプルです
        複数の行に分かれています。
        1万文字程度表示する場合は
        LazyVStackを使用することで、
        表示パフォーマンスが向上します。
        スクロールも滑らかになります。
        """
        LazyText(sampleText)
            .frame(height: 200)
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?