GeometryReader 大小计算 SwiftUI

Posted

技术标签:

【中文标题】GeometryReader 大小计算 SwiftUI【英文标题】:GeometryReader Size Calculations SwiftUI 【发布时间】:2019-09-05 05:07:15 【问题描述】:

我正在尝试使用 GeometryReader 来放置视图。我使用 GeometryReader 来 修改一个 Rectangle() 并按照我的预期放置。但是,我想以编程方式 将 y 值设置为与 VStack 框架的顶部对齐。我以为我可以阅读 文本字段的几何高度并使用它,但我无法分配几何 textField 的维度到变量,即使我使用相同的概念来移动 矩形。

如图: 简单代码:

struct ContentView: View 

    @State private var textHeight = 0.0

    var body: some View 

        VStack 

            GeometryReader  geometry in
                VStack 
                    Text("Title Text")
                    
                //self.textHeight = CGFloat(geometry.size.height)
            .border(Color.green)

            GeometryReader  geometry in
                Rectangle()
                    .path(in: CGRect(x: geometry.size.width - 50,
                                     y: 0, width: geometry.size.width / 2.0,
                                     height: geometry.size.height / 2))
                    .fill(Color.red)
            

        .frame(width: 150, height: 300).border(Color.black)
    

Xcode Beta 7、Catalina Beta 7 任何指导将不胜感激。

【问题讨论】:

【参考方案1】:

问题是您使用的是一个VStack,里面有两个GeometryReaderVStack 垂直放置它的孩子,一个在另一个之上。第二个GeometryReadery=0 是第一个第一个GeometryReader 之后的第一个y。我建议你改变你设计 UI 的方式,例如你可以通过这种方式获得相同的结果:

struct ContentView: View 
    var body: some View 
        GeometryReader  geometry in
            VStack 
                ZStack 
                    Rectangle()
                        .path(in: CGRect(x: geometry.size.width - 50, y: 0, width: geometry.size.width / 2.0, height: geometry.size.height / 4))
                        .fill(Color.red)

                    Text("Title Text")
                        .frame(width: geometry.size.width, height: geometry.size.height/2.0)
                        .border(Color.green)
                
                Spacer()
            
        
        .frame(width: 150, height: 300).border(Color.black)
    

结果是:

要上下或左右移动,您可以使用非常有用的Spacer 视图。

这是我的建议,但如果你真的需要使用两个GeometryReader,你必须这样做:

struct ContentView2: View 

    @State private var textHeight = CGFloat(0)

    private func firstContentView(geometry: GeometryProxy) -> some View 
        textHeight = geometry.size.height
        return Text("Title Text")
            .position(x: geometry.size.width/2.0, y: geometry.size.height/2.0)
    

    var body: some View 
        VStack(spacing: 0) 
            GeometryReader  geometry in
                self.firstContentView(geometry: geometry)                    
            .border(Color.green)

            GeometryReader  geometry in
                Rectangle()
                    .path(in: CGRect(x: geometry.size.width - 50, y: -self.textHeight, width: geometry.size.width / 2.0, height: geometry.size.height / 2))
                    .fill(Color.red)
            
        .frame(width: 150, height: 300).border(Color.black)
    

但这是一个非常肮脏的解决方案。

【讨论】:

以上是关于GeometryReader 大小计算 SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 如何从不同的视图中获取 GeometryReader 的大小/高度?

调整窗口大小时,SwiftUI TextField 文本边界无法使用 GeometryReader 更新,导致外观错误

SwiftUI - 计算 ScrollView 中长 GeometryReader 的高度

GeometryReader 计算视图的总高度

在不修改视图的情况下使用 GeometryReader

在 ScrollView 中使用 GeometryReader 的 SwiftUI 布局