【问题标题】:How to get Height and Width of View or Screen in SwiftUI如何在 SwiftUI 中获取视图或屏幕的高度和宽度
【发布时间】:2020-05-18 03:46:03
【问题描述】:

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

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

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

【问题讨论】:

  • 请不要忘记奖励答案(检查)。您在下面得到了一个非常好的答案!注意到乔治是个十几岁的孩子!
  • @DavidH 我确实是个少年哈哈

标签: ios swift xcode swiftui


【解决方案1】:

查看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)
    }
}

GeometryReader 破坏了您的视图布局?看看这个gist。

【讨论】:

  • 太棒了!顺便说一句,将“Color.white”更改为“Color(hue: Double(self.hue), Saturation: 1.0, Brightness: 1.0)”并在上下拖动时观察背景颜色的变化!
【解决方案2】:

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

示例

import SwiftUI

struct ContentView: View {
    var body: some View {
        GeometryReader {geometry in
            VStack {
                Text("Sizes")
                    .font(.title)
                VStack {
                    Text("Screen width via UIScreen: \(Int(UIScreen.main.bounds.width))")
                    Text("Screen height via UIScreen: \(Int(UIScreen.main.bounds.height))")
                    Text("This VStack height: \(Int(geometry.size.height))")
                    Text("This VStack width: \(Int(geometry.size.width))")
                }
            }
        }
    }
}

结果

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 2013-01-02
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多