如何在SwiftUI中获取视图或屏幕的高度和宽度

时间:2020-02-01 21:55:05

标签: ios swift xcode swiftui

我正在使用拖动手势来更改Color对象的色相/饱和度。这个想法是,您可以在屏幕上拖动并查看所有Hue值(0.0-1.0),并使用饱和度从上到下相同。

我需要屏幕的大小(或视图,这是一个单视图应用程序),以便将CGPoint值规范化/转换为0.0-1.0之间的范围,但是无论如何我都无法找到该信息。有很多讨论这个话题的线程,但是当我只想检索它时,他们通常会谈论如何设置一个视图的宽度/高度。

我一切正常,只是我正在使用硬编码值对其进行规范化。

2 个答案:

答案 0 :(得分:3)

查看GeometryReader。它允许您获取当前视图的大小:

struct ContentView: View {

    var body: some View {
        GeometryReader { geo in
            VStack {
                Text("Hello World!")
                Text("Size:  (\(geo.size.width), \(geo.size.height))")
            }
        }
    }
}

这是一个示例,您可以在屏幕上拖动以更改色相值:

struct ContentView: View {

    @State private var hue: CGFloat = 0

    var body: some View {
        GeometryReader { geo in
            ZStack {
                Color.white
                    .gesture(DragGesture().onChanged({ value in
                        self.hue = value.location.y / geo.size.height
                    }))

                VStack {
                    Text("Hello World!")
                    Text("Size:  (\(geo.size.width), \(geo.size.height))")
                    Text("Hue:  \(self.hue)")
                }.allowsHitTesting(false)
            }
        }
        .edgesIgnoringSafeArea(.all)
    }
}

答案 1 :(得分:0)

为了完整性,self.raise 将返回容器的大小。由于 OP 明确提到了屏幕尺寸,因此值得一提的是 GeometryReader 类。我们可以使用 UIScreenUIScreen.main.bounds.height 在没有 GeometryReader 的情况下获取屏幕尺寸。值得补充的是 GeometryReader 结果反映了容器的大小,这与 UIScreen.main.bounds.height 返回的内容不同

示例

UIScreen

结果

Screen sizes