問題タブ [swiftui-scrollview]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - SwiftUI コンテンツの合計幅が画面幅よりも小さい場合、動的水平スクロール ビューでコンテンツを中央に配置するにはどうすればよいですか?
動的画像配列からの画像の束を表示する水平スクロールビューがあります。コンテンツの幅の合計が画面の幅よりも大きい場合、すべて問題ありません。ただし、配列に画像が 1 つしかない場合は、デフォルトの動作である先頭に配置されます。
コンテンツの幅の合計が画面の幅よりも小さい場合にコンテンツを中央に配置したいのですが、それを実現する方法がわかりません。
したがって、この場合、画像が1つしかない場合、それは整列されていますが、コンテンツが画面いっぱいになるまで中央に配置してからスクロールします。画面いっぱいになるまでバウンスしてもバウンスしなくてもかまいません。
ios - SwiftUI - ScrollView 内の長い GeometryReader の高さを計算する
この質問に基づいています: SwiftUI - ビュー間の描画 (曲線) パス
を使用して、必要なビューとパスを描画しますGeometryReader
。問題は、画面が長くなりすぎてすべてを表示できないことです (そのようなビューは 15 ありますが、ここでは 6 つしか表示されません)。
ScrollView
だから...私は全体にaを追加します。そうGeometryReader
しないと、すべてのビューが見当違いになるためです。コードは次のとおりです。
(内容は基本的に1.画面サイズから点を計算する、2.点に沿ってパスを描く、3.点に円を配置するだけです)
問題:これで、親と子から高さを取得する必要が
あることがわかりました。これは「鶏卵問題」になります。だから私は手動での高さを計算したい。GeometryReader
ScrollView
GeometryReader
私の試み
1 回目の試行
最も簡単な方法は、いくつかの固定値を取得して、大まかな値を計算することです。これをに追加するだけGeometryReader
です:
これは機能します。しかし、今は非常に長い画面があり、下部に不要なスペースがあります。また、電話のモデルによっては、まったく異なるように見える場合があります。
2回目の試行
考えられる解決策の 1 つは、DispatchQueue.main.async
内部を使用して、そこにある計算された子の高さに変数を.body
設定することです。@State
ここで説明されているように: https://stackoverflow.com/a/61315678/1972372
そう:
これはまったく機能しません。はScrollView
何らかの理由で 100 または 10 のいずれかの固定値を受け取り、変更されることはありません。そのブロックを子のいずれかに配置して.background(...)
、それぞれの値を合計しようとしましたが、無限ループしか作成されませんでした。でも、どうにかうまくいく可能性はあったようです。
3回目の試行
このチュートリアルまたはこの回答PreferenceKeys
と同様に使用します: https://stackoverflow.com/a/64293734/1972372。
これは本当にうまくいくように思えました。ZStack
の中に を配置しGeometryReader
て、取得するビューを取得height
し、それに類似.background(...)
したものを追加しました。
と一緒.onPreferenceChange(...)
に。
しかし残念ながら、これはまったく変更されず、最初に 10 のベース値で一度しか呼び出されなかったため、すべての試みの中で最も効果がありませんでした。すべての子ビューに配置しようとしましたが、奇妙な結果しか得られなかったため、それ。
助けが必要
私は今、他の2つの頭痛の種を免れるために、愚かだが機能する最初の試みの解決策を採用したいと思っています。
試み 2 または 3 で私が何を間違えたのか、そしてなぜ私が望む結果を得ることができなかったのかを誰かが理解できますか? 彼らはうまくいくように見えるからです。
完全なコード
リクエストに応じて、ここに完全なクラスがあります (1 回目の試行手法を使用):