Выравнивание наложений по правому краю с помощью GeometryReader

#swiftui

#swiftui

Вопрос:

Я пытаюсь выровнять по правому краю несколько наложений, но не могу понять, как это сделать.

Здесь у меня есть VStack 2 изображения в правой части экрана, и я хочу отобразить текстовую метку наложения для каждого изображения слева от изображения, но выровненную по правому краю с другими метками, вот так:

       A LABEL  A
ANOTHER LABEL  B
 

Приведенный ниже код отображает метки, выровненные по центру, примерно так:

    A LABEL     A
ANOTHER LABEL  B
 
 struct TestOverlayOffset : View {
    var body : some View {
        HStack {
            Spacer()
            VStack(spacing: 32) {
                Spacer()
                Image(systemName: "a.circle").font(.title)
                    .overlay(labelOnTheLeft("A LABEL"))
                Image(systemName: "b.circle").font(.title)
                    .overlay(labelOnTheLeft("ANOTHER LABEL"))
                Spacer()
            }
            .background(Color.gray)
        }
        .background(Color.green)
    }
    
    func labelOnTheLeft(_ text: String) -> some View {
        GeometryReader { proxy in
            Text(text)
                .fixedSize()
                .foregroundColor(.black)
                .background(Color.yellow)
                .offset(x: -128 - proxy.size.width/2)
        }
    }
}
 

Ответ №1:

Вот возможное решение (с наименьшими изменениями и удалением жесткого кода).

Протестировано с Xcode 12.1 / iOS 14.1

ДЕМОНСТРАЦИЯ

 func labelOnTheLeft(_ text: String) -> some View {
    GeometryReader { proxy in
        Text(text)
            .fixedSize()
            .foregroundColor(.black)
            .background(Color.yellow)
            .padding(.trailing)
            .offset(x: -proxy.size.width)
            .frame(width: proxy.size.width, alignment: .trailing)
    }
}