【问题标题】:iOS 14 has Changed (or broken?) SwiftUI GeometryReaderiOS 14 已更改(或损坏?)SwiftUI GeometryReader
【发布时间】:2021-01-04 14:17:48
【问题描述】:

从今天发布的 iOS 14.0 开始,我的 iOS 代码(严重依赖 GeometryReader 进行布局)不再运行良好。也就是说,布局有点随机化。

在 Xcode 调试器中,我比较了在 iOS 13.6 和 iOS 14.0 上运行的相同代码,发现问题在于 iOS 14.0 中没有初始化 GeometryProxy 结构。

在变量 g 下面的示例代码中,一个 GeometryProxy,在 iOS 13 中具有有效的宽度和高度值,但在 iOS 14 中全为零。(这只是我对 GeometryProxy 值所做的更简单的用途之一——我会如果没有人指出这个 sn-p 可以通过另一种方式更容易完成的明显事实,我将不胜感激。)

这是对 GeometryReader 的更改还是错误?有人有解决方法吗?我是否在依赖 GeometryReader 进行动态布局时犯了一个大错误?

struct TextView: View {
  @EnvironmentObject var data: RecorderData
  let m = MusicalNote()

  var body: some View {
      GeometryReader { g in
          Stack(alignment: .leading) {
              Text(self.data.curNote.getString())
                 .font(.system(size: g.size.height / 2.4))
                 .padding(.bottom)
              Text(self.data.fdata.fingerings[self.data.curRecorder.id] ![self.data.curNote.seq] ![self.data.curFingType] ![self.data.currentFingeringChoice].comment)
                 .font(.headline)
        }
      Spacer()
    }
  }
}

【问题讨论】:

  • 系统更新的任何不同行为都值得提交反馈,越早越好。
  • 你会准备最小可重现的例子吗?
  • 我尝试做一个非常简单的例子来重现这一点,发现只有一个视图或一个视图和一个子视图,GeometryProxy 被正确填充。我正在浏览我的应用程序代码,看看我是否能找到不同的东西(除了大小和复杂性),如果我能找到将它添加到示例中。
  • GeometryProxy 值是否可以在单独的线程中设置?我问这个是因为看起来虽然第一次通过视图代码时值为零,但如果有需要重新绘制视图的数据更新,则设置值 - 但有时直到第二次或第三次通过,它似乎有所不同。无论如何,我无法在一个非常简单的示例中重现这一点。很高兴知道其他人是否遇到此问题。
  • 我也有同样的问题,谁能帮忙解决一下?

标签: ios swift swiftui ios14


【解决方案1】:

确实发生了变化——这篇文章总结了这一点:https://swiftui-lab.com/geometryreader-bug/

GeometryReader 现在布局其内容的方式与以前不同。它曾经在父级中水平和垂直居中,但现在它与左上角对齐。

我的应用看起来很糟糕 - 令人沮丧的是,不清楚这是否是新行为并且符合设计,或者它是否是一个错误并且将被修复。我正在尝试通过我的应用程序并手动应用偏移量,但使用 GeometryReader 的布局的动态特性意味着它并不总是那么容易。

【讨论】:

  • 感谢您提供此链接。但我认为这里发生了两件事。您引用的链接描述了一个问题 - 对齐方式的变化。我描述的问题与何时填写 GeometryProxy 值有关。我在代理大小参数中看到零,并得出结论这是因为我在 .onAppear() 中计算我的动态大小。在 iOS 13 中,代理大小参数在调用 .onAppear 时已经设置,但在 iOS 14 中没有。我通过将大小计算移动到视图主体而不是 .onAppear() 解决了我的问题。
  • 我分享你的挫败感......真是个错误。
  • @lp1756 当我尝试在 .onAppear() 中使用代理值时,我看到了类似的问题,代理值为 0。尽管在您的示例中,您似乎没有使用 .onAppear()?
  • @bze12 你是对的。在我的示例中,当在调试器中运行时,代理值在 iOS 14 中为零,但在 iOS13 中很好—— .onAppear() 不是示例中的一个因素。我所知道的是,在我的应用程序中,当我将代理值的使用从 .onAppear 移动到视图主体时,应用程序开始正确计算动态布局。我仍然对这个错误/更改的确切性质感到困惑——但我的应用程序现在正在运行(直到他们在 iOS 15 中更改了其他内容!!)
【解决方案2】:

编辑我之前的答案,因为它现在显然是个坏建议

来自https://developer.apple.com/documentation/xcode-release-notes/xcode-12-release-notes

针对 iOS 14、macOS 11、watchOS 7 和 tvOS 14 SDK 重新构建更改了 GeometryReader 的使用,以可靠地领先对齐 GeometryReader 内的视图。这是之前的行为,除非在 GeometryReader 中无法检测到单个静态视图。 (59722992) (FB7597816)

这至少在我看来,以前的行为按照他们的标准是有问题的——尽管它符合其他布局容器的约定,例如VStack。而且这种行为是新常态。

【讨论】:

  • 是的:“......可靠地打破你最近写的所有东西......”会更准确!
猜你喜欢
  • 2021-01-11
  • 1970-01-01
  • 2011-07-11
  • 2023-03-11
  • 2019-10-30
  • 2018-12-27
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
相关资源
最近更新 更多