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

Posted

技术标签:

【中文标题】SwiftUI - 如何从不同的视图中获取 GeometryReader 的大小/高度?【英文标题】:SwiftUI - How to get GeometryReader size/height from different View? 【发布时间】:2021-04-25 19:34:58 【问题描述】:

如何从另一个视图访问一个视图的大小?

为了获得“Hello world!”文本的高度,我在其上附加了 .background()GeometryReader。目前,我只是使用let _ = print(proxy.size.height) 打印高度。

struct ContentView: View 
    var body: some View 
        VStack 
            Text("Hello world!")
                .background(
                    GeometryReader  proxy in
                        Color.clear /// placeholder
                        let _ = print(proxy.size.height) /// 20.333333333333332
                    
                )
            
            Text("Height of first text is ???")
        
    

结果:

我现在想用“Hello world!”的高度替换???。我该怎么做?

【问题讨论】:

类似问题:***.com/a/59733037/14351818 【参考方案1】:

你可以:

    创建一个@State 属性来存储高度 使用附加到Color.clear.onAppear 设置它 将??? 替换为\(textHeight)
struct ContentView: View 
    @State var textHeight = CGFloat(0) /// 1.

    var body: some View 
        VStack 
            Text("Hello world!")
                .background(
                    GeometryReader  proxy in
                        Color.clear
                            .onAppear  /// 2.
                                textHeight = proxy.size.height
                            
                    
                )
                                          /// 3.
            Text("Height of first text is \(textHeight)") 
        
    

结果:

【讨论】:

onAppear 仅在它出现时被调用,因此它不处理方向变化。 我在 WWDC21 期间与一位 Apple 工程师交谈,他们说要处理方向,请附上 .onChange

以上是关于SwiftUI - 如何从不同的视图中获取 GeometryReader 的大小/高度?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何从 OutlineGroup 中获取选择?

SwiftUI:从列表中的项目获取切换状态

从公共 API 获取 JSON 以在 SwiftUI 的列表视图中呈现

如何在 SwiftUI 子视图中执行函数?

如何在同一个“主”视图中切换 2 个不同的视图? SwiftUI

如何在最新的 SwiftUI App 中获取窗口或视图的所有子视图?