iOS 14 mudou (ou quebrou?) SwiftUI GeometryReader
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
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.
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.