首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI:在GeometryReader提供最终大小后初始化视图(iOS与macOS)

SwiftUI:在GeometryReader提供最终大小后初始化视图(iOS与macOS)
EN

Stack Overflow用户
提问于 2022-06-21 17:36:24
回答 1查看 130关注 0票数 0

我有一个观点,需要知道它的父母的大小时,被削弱。下面是一个简化的代码示例,其中Text显示GeometryReader提供的大小。

代码语言:javascript
复制
    struct ContentView: View {
        var body: some View {
            GeometryReader { proxy in
                ZStack {
                    Rectangle()
                        .frame(maxWidth: .infinity, maxHeight: .infinity)
                        .foregroundColor(.blue)
                    Text("Size: \(proxy.size.width) x \(proxy.size.height)")
                }
            }
        }
}

当我在iOS上运行这段代码时,body只更新一次,大小从一开始就正确。当我在macOS上运行这段代码时,body会被更新四次。前三次大小是错误的,只有第四次大小是正确的。

在这个例子中,没有那么重要,但是在我的应用程序中,布局和动画取决于从一开始就知道父视图的正确大小。

有什么想法可以确保Text只有在macOS上有最终大小时才会被弱化吗?

EN

回答 1

Stack Overflow用户

发布于 2022-06-27 12:47:12

经过一段时间的修改之后,我尝试使用Asperi在这个答案中描述的自定义几何阅读器:使用此CustomGeometryReaderViewhttps://stackoverflow.com/a/69931609/14542345将立即在macOS上提供正确的大小,这是很棒的,它也适用于iOS。

不幸的是,当动画大小发生变化时,我遇到了问题。由于大小似乎比常规的GeometryReader晚一些动画被延迟(例如,在macOS上折叠侧边栏,当边栏已经消失时视图仍然是动画的)。

奇异解

解决方案(老实说,我不明白为什么会这样)是在CustomGeometryReaderView中包装常规GeometryReader,但只使用来自常规GeometryReader的值。

代码语言:javascript
复制
CustomGeometryReaderView { size in
       GeometryReader { proxy in
             ZStack {
                  Rectangle()
                        .frame(maxWidth: .infinity, maxHeight: .infinity)
                        .foregroundColor(.blue)
                  Text("Size: \(proxy.size.width) x \(proxy.size.height)")
              }
       }
}

来自自定义读取器的大小从未被使用过,但它会导致常规GeometryReader只发送一次.onAppear大小,而不是再次发送三次.onChange

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72704975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档