SwiftUI:.transition将ZStack中的对齐方式从中心更改为顶部?

时间:2020-02-24 02:25:13

标签: ios swiftui

在ZStack内使用GeometryReader,如果指定了过渡,我看到的内容是对齐在最前面的,但是没有指定过渡,则内容居中。这是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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

为什么不使用提供的GeometryProxy值使用GeometryReader?

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()
    }
}