https://www.youtube.com/watch?v=TvkmI4CXsh0
このSwiftコードは、SwiftUIを使用してPinterestのようなグリッドビューを実装するものです。コードは大きく分けて3つの部分に分かれています:
ContentView はメインのビューを定義しています。 gridItems はグリッド内に表示される各アイテムのリストです。それぞれのアイテムは GridItem 構造体のインスタンスです。 @State private var columns は表示する列の数を保持しています。この値はユーザーの操作によって変更できます。 NavigationView と ScrollView はユーザーインターフェイスの構造を提供し、PinterestGrid ビューを使用してアイテムを表示します。 removeBtn と addBtn はナビゲーションバーに表示され、列の数を調整するためのボタンです。
GridItem 構造体はグリッド内の各アイテムを表します。それぞれのアイテムには一意のID、高さ(height)、画像の名前(imgString)があります。
PinterestGrid は実際にグリッドレイアウトを生成するカスタムビューです。 内部に Column 構造体を持ち、各列を表します。各列は GridItem のリストを保持します。 初期化時に、アイテムを最も短い列に追加することでバランスの取れたレイアウトを作成します。これは列の現在の高さを追跡し、新しいアイテムが追加されると更新することで行われます。
ユーザーは「Add」や「Remove」ボタンを使って列の数をリアルタイムで調整できます。これにより、画面のサイズやユーザーの好みに応じてレイアウトを変更することが可能です。
PinterestGrid は、追加される各アイテムを最も短い列に配置することで、均一でバランスの取れたグリッドレイアウトを作成します。これは特に異なる高さのアイテムを扱う際に有効です。
PinterestGrid と GridItem はカスタムビューとして実装されており、再利用可能で柔軟なコード構造を提供します。これにより、将来的な拡張やメンテナンスが容易になります。
gridItems 配列には多数のアイテムが含まれる可能性があります。LazyVStack を使用することで、これらのアイテムを効率的に扱うことができます。特に、ユーザーが画面をスクロールして新しいアイテムが表示される場合に、そのアイテムが表示される直前にのみレンダリングされます。
LazyVStack は、画面上に現在表示されているビューのみをメモリ上に保持し、それ以外のビューは必要になるまでレンダリングしません。これにより、アプリのメモリ使用量を抑えることができます。
画面に一度に表示されるアイテムの数が多い場合、LazyVStack を使用することで初期のレンダリング時間を短縮し、全体的なパフォーマンスを向上させることができます。
このコードにおいて、LazyVStack はPinterestのようなグリッドビューを実現するために使用されており、特に画像やコンテンツが多い場面でその効果を発揮します。ユーザーがスクロールする際にスムーズな体験を提供し、アプリの応答性を保ちながら効率的にコンテンツを表示することが可能です。
このコードにおける GeometryReader の使用は、SwiftUI のレイアウトシステムにおいて重要な役割を果たしています。GeometryReader を使用することで以下のような利点が得られます:
GeometryReader は、その内部のビューが親ビューに対してどのようなサイズと位置を持つべきかを決定するために使われます。これにより、ビューのサイズや位置を動的に調整することが可能になります。
このコードでは、GeometryReader を使って各画像のサイズを動的に設定しています。これにより、画像は親ビュー(この場合はグリッドの各セル)のサイズに合わせて適切に拡大縮小され、レイアウトがより柔軟になります。
GeometryReader を使用することで、ビューのサイズが変更された場合でも、アスペクト比を維持するように画像を調整できます。これは画像の表示品質を高め、よりプロフェッショナルなユーザーインターフェイスを実現するのに役立ちます。
デバイスや画面サイズが異なる環境でも、GeometryReader を用いることでビューが適切に調整され、一貫したユーザー体験を提供することができます。
このコードでは、GeometryReader を使って画像が各グリッドセルに適切にフィットするようにし、レイアウトがデバイスのサイズや向きの変更に柔軟に対応できるようにしています。これは特に、異なるデバイスや画面サイズで一貫した見た目を提供することが重要なモバイルアプリケーションにおいて有用です。