1

Textコンテンツが更新されるたびにコンテンツの最後まで自動的にスクロールするビューが必要な SwiftUI iOS アプリを作成しています。更新はモデルから行われます。アプリの詳細でこの質問が複雑にならないように、2 つのテキスト フィールドとテキスト ラベルを持つ単純なシナリオを作成しました。テキスト フィールドに入力されたテキストは連結され、テキスト ラベルに表示されます。テキスト ラベルは横線で囲まれScrollView、テキストが画面幅より長い場合は手動でスクロールできます。私が達成したいのは、ラベルが更新されるたびにテキストが自動的に最後までスクロールすることです。

簡単なモデル コードは次のとおりです。

class Model: ObservableObject {
    var firstString = "" {
        didSet { combinedString = "\(firstString). \(secondString)." }
    }
    
    var secondString = "" {
        didSet { combinedString = "\(firstString). \(secondString)." }
    }
    
    @Published var combinedString = ""
}

これは ContentView です。

struct ContentView: View {
    @ObservedObject var model: Model
    
    var body: some View {
        VStack(alignment: .leading, spacing: 10) {
            TextField("First string: ", text: $model.firstString)
            TextField("Second string: ", text: $model.secondString)
            Spacer().frame(height: 20)
            Text("Combined string:")
            ScrollView(.horizontal) {
                Text(model.combinedString)
            }
        }
    }
}

私が行った調査から、手動で行うことなくテキストの最後までスクロールすることがわかった唯一の方法は、ビューにボタンを追加することです。これにより、ラベル内のテキストが最後までスクロールされます。 .

上記は にScrollView埋め込まれておりScrollViewReader、スクロール アクションを実行するためのボタンがあります。

ScrollViewReader { scrollView in
    VStack {
        ScrollView(.horizontal) {
            Text(model.combinedString)
                .id("combinedText")
        }
        Button("Scroll to end") {
            withAnimation {
                scrollView.scrollTo("combinedText", anchor: .trailing)
            }
        }
        .padding()
        .foregroundColor(.white)
        .background(Color.black)
    }
}

これは、ボタンを使用してスクロール アクションを実行することを意図している場合に機能します。

私の質問は、ボタンをクリックすることなく、モデルが更新されるたびに上記のスクロール アクションをトリガーできるかどうかです。

どんな助けや指針も大歓迎です。

ありがとう。

4

2 に答える 2