Meu aplicativo possui uma matriz hand
de uma estrutura com uma propriedade let blatt: Image
. Durante init
, an Image
é atribuído a esta propriedade.
Para exibir tal array horizontalmente, eu uso o seguinte código ( scaledWidth
é alguma constante):
HStack(spacing: 10) {
ForEach((0 ..< hand.count), id: \.self) {
hand[$0].blatt
.resizable()
.scaledToFit()
.frame(height: scaledWidth)
.border(.black)
}
}
Isso fornece a seguinte saída:
Isso é o que eu esperava.
Outra matriz deve ser exibida verticalmente. Para isso, estou utilizando o seguinte código:
VStack(spacing: 10) {
ForEach((0 ..< hand.count), id: \.self) {
hand[$0].blatt
.resizable()
.scaledToFit()
.rotationEffect(Angle(degrees: 90))
.frame(width: scaledWidth, height: scaledWidth)
.border(.black)
}
}
Isso fornece adicionalmente a seguinte saída:
Aqui, a altura de cada quadro, indicada pelo quadro com borda, é a altura da imagem não girada.
Como conheço a proporção aspectRatioBlatt
das imagens, posso ajustar a saída usando .frame(width: scaledWidth, height: scaledWidth / aspectRatioBlatt)
. Então, os quadros têm as dimensões corretas e o espaçamento correto, mas as imagens internas são muito pequenas. Novamente, a altura do quadro é igual à altura da imagem interna não girada.
Tentei muitos modificadores de visualização e várias combinações, mas falhei. Até tentei usar um layout personalizado como sugerido aqui para o Text vertical , mas também não funcionou.
Claro que eu poderia usar um segundo conjunto de imagens transformadas, mas deveria ser possível sem ele no SwiftUI.
Como fazer certo?
Pode ser mais simples girar
HStack
.Caso contrário, se você souber a proporção, poderá definir o tamanho do quadro antes da rotação e ajustar a altura após a rotação:
Descobri que também funcionava definindo apenas a largura e depois usando
scaledToFill
: