SwiftUI: .transition меняет выравнивание в ZStack от центра к вершине? - PullRequest
2 голосов
/ 24 февраля 2020

Используя GeometryReader внутри ZStack, если указан переход, я вижу, что содержимое выравнивается по верху, но без указанного перехода содержимое центрируется. Это ошибка в SwiftUI, или я что-то упустил? (Я понимаю, что в этом тривиальном примере фактический переход не может произойти, но я столкнулся с этим в более сложном сценарии, в котором может произойти переход.)

Вот код:

public struct ContentView: View {
    public var body: some View {
        ZStack(alignment: .center) {
            GeometryReader { proxy in
                Text("Foo bar baz foo bar baz foo bar baz")
                    .animation(.default)
                    .transition(.opacity)   // Without this line, the text is centered.
            }
        }
    }
}

Без строки .transition(.opacity) макет:

enter image description here

С строкой .transition(.opacity) макет:

enter image description here

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

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

Вариант 1:

ZStack(alignment: .center) {
  GeometryReader { proxy in
    VStack {
        Text("Foo bar baz foo bar baz foo bar baz")
            .animation(.default)
            .transition(.opacity)
    }
  }
}

Вариант 2:

  GeometryReader { proxy in
    ZStack(alignment: .center) {
        Text("Foo bar baz foo bar baz foo bar baz")
            .animation(.default)
            .transition(.opacity)
    }
  }

Я бы предпочел вариант 2

0 голосов
/ 24 февраля 2020

Зачем использовать GeometryReader без использования предоставленного значения GeometryProxy?

import SwiftUI

public struct ContentView: View {
    public var body: some View {
        ZStack(alignment: .center) {
            GeometryReader { proxy in
                Text("Foo bar baz foo bar baz foo bar baz")
                    .position(.init(x: proxy.size.width / 2, y: proxy.size.height / 2))
                    .animation(.default)
                    .transition(.opacity)   // The text is centered now.
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...