SwiftUI: o texto não atinge a largura total da tela após a rotação

Dec 01 2020

O aplicativo suporta apenas o modo potrait. Duas perguntas devem ser exibidas, mas são alternadas de acordo. Assim, os jogadores podem ver bem as questões, não importa onde se sentem.

De qualquer forma, parece que a caixa delimitadora não é girada durante a rotação.

ZStack {
        HStack {
            GeometryReader { proxy in
                Text(challenge)
                    .rotationEffect(Angle(degrees: 90), anchor: .center)
                    .frame(maxWidth: proxy.size.height, minHeight: proxy.size.width)
                    .foregroundColor(.red)
                    .font(.largeTitle)
                    .background(Color.blue)
            }
            Spacer()
            GeometryReader { proxy in
                Text(challenge)
                    .rotationEffect(Angle(degrees: 270), anchor: .center)
                    .frame(maxWidth: proxy.size.height, minHeight: proxy.size.width)
                    .foregroundColor(.red)
                    .font(.largeTitle)
                    .background(Color.blue)
            }
        }
    }

Eu tentei muitas coisas diferentes. Eu deixei de fora o GeometryReadere trabalhei com 'fixedSize () `. Então recebo uma linha que atravessa a tela.

Também tentei esta solução , mas não funciona como esperado.

Meu resultado é sempre um texto que não usa a largura total. (A sobreposição é apenas mais um erro, mas com certeza vou colocar isso sob controle).

O que eu realmente quero ter:

Respostas

2 Asperi Dec 01 2020 at 23:33

Aqui está uma demonstração de uma abordagem possível. Preparado com Xcode 12.1 / iOS 14.1

struct DemoView: View {
    var body: some View {
        HStack {
            RotatedText(text: lorem, angle: Angle(degrees: 90))
            RotatedText(text: lorem, angle: Angle(degrees: -90))
        }
    }
}

struct RotatedText: View {
    let text: String
    let angle: Angle
    var color: Color = .blue
    
    var body: some View {
        color.overlay(
            GeometryReader { gp in
                VStack {
                    Text(text)
                        .frame(width: gp.size.height, height: gp.size.width)
                        .rotationEffect(angle)
                }.frame(width: gp.size.width, height: gp.size.height)
            }
        )
    }
}