問題
SwiftUIでの開発で必ず使用するText
ですが、非常に長い文字列を表示することはあまり想定されていないようです(T_T)
実際にNavigationLink
による遷移先にScrollView
でラップされたText
を用意して、10000文字程度の日本語の文字列を表示する様子をInstrumentsで確認すると、遷移する直前に画面が固まってしまいます。
var body: some View {
NavigationStack {
NavigationLink(destination: ScrollView{Text("ここに非常に長いテキスト")}) {
Text("Link")
}
}
}
解決策
文字列を改行で区切り、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)