Ios SwiftUI:“过渡”将ZStack中的对齐方式从中间更改为最前面的对齐方式?

Ios SwiftUI:“过渡”将ZStack中的对齐方式从中间更改为最前面的对齐方式?,ios,swiftui,Ios,Swiftui,在ZStack内部使用GeometryReader,如果指定了一个过渡,我会看到内容是对齐的顶部前导,但如果没有指定过渡,则内容是居中的。这是SwiftUI中的一个bug,还是我遗漏了什么?(在这个简单的例子中,我意识到永远不会发生实际的转换,但我在一个更复杂的场景中遇到了这种情况,其中可能会发生转换。) 代码如下: public struct ContentView: View { public var body: some View { ZStack(alignmen

在ZStack内部使用GeometryReader,如果指定了一个过渡,我会看到内容是对齐的顶部前导,但如果没有指定过渡,则内容是居中的。这是SwiftUI中的一个bug,还是我遗漏了什么?(在这个简单的例子中,我意识到永远不会发生实际的转换,但我在一个更复杂的场景中遇到了这种情况,其中可能会发生转换。)

代码如下:

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)
行,则布局为:

使用
.transition(.opacity)
行,布局为:


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

为什么使用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()
    }
}

你试过这些变种吗?我确实尝试过显式地直接指定对齐方式,但运气不佳。@UberJason,是的,用Xcode 11.2/iOS 13.2Oh对这两种方式进行了测试,很抱歉,我在第一个变体中没有看到VStack。谢谢关于默认行为的有趣想法。我知道你是从哪里来的,但我不清楚为什么添加转换会改变这种行为,不管默认值是什么。这对我来说是出乎意料的。