如何在SwiftUI中调整演示定位器的内容大小

c2e8gylq  于 2022-11-21  发布在  Swift
关注(0)|答案(1)|浏览(126)

我可以在SwiftUI中显示一个带有自定义高度和定位器的表单,如下所示。

.sheet(isPresented: $showSheet) {
    MySheet()
        presentationDetents([.height(500), .large])
}

是否有一种方法可以测量视图MySheet的精确高度,并将其传递给presentationDetents,而不需要固定值?我这样问是因为视图的高度可能会根据用户的辅助功能设置而改变。

l7wslrjt

l7wslrjt1#

方法:

  • 测量所显示内容的大小,并将值设置为@State变量
  • 在所显示内容的背景中使用GeometryReader来测量内容的高度。
  • GeometryReader被添加到正被呈现的内容的背景而不是前景,因为GeometryReader倾向于扩展到像颜色或形状那样给予它的所有空间。

注:

  • 这是一种粗糙的方法,很高兴听到任何更好的方法

代码

struct ContentView: View {
    @State private var isSheetShown = false
    @State private var sheetContentHeight = CGFloat(0)

    var body: some View {
        Button("Show sheet") {
            isSheetShown = true
        }
        .sheet(isPresented: $isSheetShown) {
            VStack {
                Text("hello line 1")
                Text("hello line 2")
                Text("hello line 3")
            }
            .background {
                //This is done in the background otherwise GeometryReader tends to expand to all the space given to it like color or shape.
                GeometryReader { proxy in
                    Color.clear
                        .onAppear {
                            print("size = \(proxy.size.height)")
                            sheetContentHeight = proxy.size.height
                        }
                }
            }
            .presentationDetents([.height(sheetContentHeight)])
        }
    }
}

相关问题