Usando o seguinte
@main
struct aspectratioApp: App {
var body: some Scene {
WindowGroup { ContentView().border(.blue, width: 2).padding() }
}
}
e ContentView
sem o aspectRatio
modificador aplicado (veja abaixo), os resultados são como esperado, incl. Canvas
preenche o espaço disponível (que eu acho que é o comportamento padrão), gerando canvas size: (243.0, 78.0)
no console:
Em seguida, vamos aplicar o .aspectRatio(isSquare ? 1 : nil, contentMode: isSquare ? .fit : .fill)
modificador, que acredito que está dizendo para fazer Canvas
um quadrado que se encaixe ou o que quer que preencha o espaço disponível (veja ContentView com aspectRatio abaixo). Logo de início, obtenho um quadrado Canvas
como este:
e um tamanho de tela quadrada impresso no console. A alternância isSquare
mantém o quadrado da tela com um tamanho ligeiramente menor:
canvas size: (157.0, 157.0)
canvas size: (130.0, 130.0)
O que estou esquecendo aqui? A documentação para aspectRatio documenta o parâmetro aspectRatio da seguinte forma: A proporção de largura para altura a ser usada para a visualização resultante. Use nil para manter a proporção atual na visualização resultante. que eu interpreto como significando qualquer que seja a proporção se o modificador não for aplicado.
Não é assim que funciona? O modificador não é stateless, ou seja, ele se lembrou de que a tela era quadrada uma vez e está apenas mantendo isso para sempre, incl. em reinicializações do aplicativo?
ContentView sem AspectRatio
struct ContentView: View {
@State private var isSquare = false
var body: some View {
VStack {
Text("isSquare: \(isSquare)").padding()
Canvas { _, size in print("canvas size: \(size)") }
.border(.teal, width: 2)
.padding()
Toggle(isOn: $isSquare) { Text("Constrain to Square") }.padding()
}
.border(.yellow, width: 2)
.padding()
}
}
ContentView com proporção de aspecto
struct ContentView: View {
@State private var isSquare = false
var body: some View {
VStack {
Text("isSquare: \(isSquare)").padding()
Canvas { _, size in print("canvas size: \(size)") }
.aspectRatio(isSquare ? 1 : nil, contentMode: isSquare ? .fit : .fill)
.border(.teal, width: 2)
.padding()
Toggle(isOn: $isSquare) { Text("Constrain to Square") }.padding()
}
.border(.yellow, width: 2)
.padding()
}
}