O que há de errado com o código a seguir, que faz com que a viewSize
altura permaneça zero apesar de ter um frame
modificador definido como altura 60?
struct TestGeometryModifierView: View {
@State var viewSize:CGSize = .zero
var body: some View {
Color.red
.onGeometryChange(for: CGSize.self) { proxy in
proxy.size
} action: { newValue in
viewSize = newValue
print("View Size \(newValue)")
}
.frame(height:viewSize.height)
}
}
#Preview {
TestGeometryModifierView()
.frame(height:60)
}
A declaração print no console mostra apenas uma linha. Espero que ela mude quando a altura do quadro for definida na visualização.
View Size (402.0, 0.0)
A
Color
é ganancioso e consome o máximo de espaço possível. No entanto, você também está definindo a altura usando.frame
e essa altura é inicializada como zero. Então, no show inicial, a largura é a mais larga possível, mas a altura é zero.A altura que você está medindo usando
.onGeometryChange
é, portanto, zero, em outras palavras, o valor com o qual a variável de estado foi inicializada. Como o tamanho não muda,.onGeometryChange
não é acionado novamente.A altura de 60 que você está definindo na vista ao redor não tem impacto na vista que você está medindo com
.onGeometryChange
. Então esse modificador adicional.frame
não causa.onGeometryChange
o gatilho.Se você estiver tentando medir o tamanho total disponível, você pode usar um opcional para a variável de estado:
O modificador
.onGeometryChange
ainda é acionado apenas uma vez porque o tamanho inicial é o mesmo que o tamanho definido pelo.frame
modificador. Mas agora, a variável de estado mede um valor útil: