SwiftUI GeometryReaderの位置は気をつけないと。

LazyVGridでGeometryReaderを使用する

ダメな例

ScrollViewとLazyVGridの間にGeometryReaderを入れたケース。
スクロールがうまく動きません。

import SwiftUI

struct ExampleGridView: View {
    var body: some View {
        var columns: [GridItem] =
                 Array(repeating: .init(.flexible()), count: 2)
        NavigationView {
            ScrollView {
                GeometryReader { geometry in
                    LazyVGrid(columns: columns) {
                        ForEach((0...79), id: \.self) {
                            let codepoint = $0 + 0x1f600
                            let codepointString = String(format: "%02X", codepoint)
                            Text("\(codepointString)")
                            let emoji = String(Character(UnicodeScalar(codepoint)!))
                            Text("\(emoji)")
                        }
                    }.font(.largeTitle)
                }
            }
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

struct ExampleGridView_Previews: PreviewProvider {
    static var previews: some View {
        ExampleGridView()
    }
}

大丈夫な例

ScrollViewの前にGeometryReaderを入れたケース。

import SwiftUI

struct ExampleGridView: View {
    var body: some View {
        var columns: [GridItem] =
                 Array(repeating: .init(.flexible()), count: 2)
        NavigationView {
            GeometryReader { geometry in
                ScrollView {
                    LazyVGrid(columns: columns) {
                        ForEach((0...79), id: \.self) {
                            let codepoint = $0 + 0x1f600
                            let codepointString = String(format: "%02X", codepoint)
                            Text("\(codepointString)")
                            let emoji = String(Character(UnicodeScalar(codepoint)!))
                            Text("\(emoji)")
                        }
                    }.font(.largeTitle)
                }
            }
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

struct ExampleGridView_Previews: PreviewProvider {
    static var previews: some View {
        ExampleGridView()
    }
}

Swift

Posted by shi-n