首页 > 解决方案 > 如何检索特定视图的高度?

问题描述

假设我有一个圆圈,我想在交互时更改其半径。我希望将半径定义为视图高度的百分比。我有以下内容:

struct ButtonView: View {

    @State private var radius: CGFloat = 0.1 * geometry.size.height

    var body: some View {
        GeometryReader { geometry in
            Button(action: {
                withAnimation(.easeIn) { () -> Result in
                    self.radius = 0.1 * geometry.size.height
                }
            }) {
                Circle().frame(width: self.radius, height: self.radius)
            }
            .onLongPressGesture(minimumDuration: 0, maximumDistance: 0, pressing: { (true) in
                self.radius = 0.1 * geometry.size.height - 10
            }) {}
        }
    }
}

我的问题是我不能在变量语句中引用“geometry.size.height”,因为它没有嵌套在 GeometryReader 中。我试过使用'UIScreen.main.bounds.width',但这给出了整个屏幕的高度。在我的情况下,我有兴趣获得标签栏上方的视图高度,因为 ButtonView 嵌套在一个中。

标签: iosswiftswiftui

解决方案


State 变量的初始值不能基于特定的布局。创建结构时,它不知道布局是什么。但是您可以在布局期间自由使用 GeometryReader 的代理。例如,这会将圆圈缩放到视图高度的 10% 到 50% 之间。请注意maxHeight框架中此处的使用。

struct ButtonView: View {

    @State private var scale: CGFloat = 0.1

    var body: some View {
        GeometryReader { proxy in
            Button(action: { self.scale = (self.scale == 0.1) ? 0.5 : 0.1 }) {
                Circle()
            }
            .frame(maxHeight: proxy.size.height * self.scale)
        }
    }
}

如果您想在第一次出现时将信息捕获到 State 变量中,那么您可以在一个onAppear块中执行此操作。

struct ButtonView: View {

    @State private var radius: CGFloat = 0.0

    var body: some View {
        GeometryReader { proxy in
            Button(action: { self.radius = 0.5 * proxy.size.height }) {
                Circle()
            }
            .frame(maxHeight: self.radius)
            .onAppear { self.radius = 0.1 * proxy.size.height}
        }
    }

推荐阅读