iOS 14 mudou (ou quebrou?) SwiftUI GeometryReader

Sep 17 2020

A partir do lançamento de hoje do iOS 14.0, meu código iOS, que depende muito do GeometryReader para layout, não está mais funcionando bem. Ou seja, o layout foi meio aleatório.

No depurador Xcode, comparei o mesmo código em execução no iOS 13.6 com o iOS 14.0 e vi que o problema é que a estrutura GeometryProxy não está sendo inicializada no iOS 14.0.

No código de exemplo abaixo da variável g, um GeometryProxy, tem valores de largura e altura válidos no iOS 13, mas são todos zeros no iOS 14. (Este é apenas um dos usos mais simples que faço dos valores de GeometryProxy - eu agradeceria se ninguém aponta o fato óbvio de que este snippet poderia ser realizado muito mais facilmente de outra maneira.)

Isso é uma mudança no GeometryReader ou um bug? Alguém tem uma solução alternativa? Cometi um grande erro dependendo do GeometryReader para layout dinâmico?

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()
    }
  }
}

Respostas

4 GraemeFoster Sep 20 2020 at 12:56

Definitivamente mudou - esta postagem resume: https://swiftui-lab.com/geometryreader-bug/

GeometryReader agora apresenta seu conteúdo diferente de como costumava ser. Costumava centralizá-lo horizontalmente e verticalmente no pai, mas agora ele o alinha no canto superior esquerdo.

Meu aplicativo parece horrível - o que é frustrante é que não está claro se esse é um novo comportamento e está como projetado ou se é um bug e será corrigido. Estou tentando acessar meu aplicativo e aplicar deslocamentos manualmente, mas a natureza dinâmica dos layouts usando GeometryReader significa que nem sempre é fácil.

1 AndrewLipscomb Sep 28 2020 at 01:19

Editando minha resposta anterior porque agora é um conselho obviamente ruim

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

A reconstrução em relação aos SDKs do iOS 14, macOS 11, watchOS 7 e tvOS 14 muda os usos do GeometryReader para alinhar de forma confiável as visualizações dentro do GeometryReader. Esse era o comportamento anterior, exceto quando não era possível detectar uma única visualização estática dentro do GeometryReader. (59722992) (FB7597816)

O que diz, pelo menos para mim, que o comportamento anterior era problemático para seus padrões - apesar de corresponder às convenções de outros contêineres de layout como VStack. E que esse comportamento é o novo normal.