Ios SwiftUI:“过渡”将ZStack中的对齐方式从中间更改为最前面的对齐方式?
在ZStack内部使用GeometryReader,如果指定了一个过渡,我会看到内容是对齐的顶部前导,但如果没有指定过渡,则内容是居中的。这是SwiftUI中的一个bug,还是我遗漏了什么?(在这个简单的例子中,我意识到永远不会发生实际的转换,但我在一个更复杂的场景中遇到了这种情况,其中可能会发生转换。) 代码如下:Ios SwiftUI:“过渡”将ZStack中的对齐方式从中间更改为最前面的对齐方式?,ios,swiftui,Ios,Swiftui,在ZStack内部使用GeometryReader,如果指定了一个过渡,我会看到内容是对齐的顶部前导,但如果没有指定过渡,则内容是居中的。这是SwiftUI中的一个bug,还是我遗漏了什么?(在这个简单的例子中,我意识到永远不会发生实际的转换,但我在一个更复杂的场景中遇到了这种情况,其中可能会发生转换。) 代码如下: public struct ContentView: View { public var body: some View { ZStack(alignmen
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。谢谢关于默认行为的有趣想法。我知道你是从哪里来的,但我不清楚为什么添加转换会改变这种行为,不管默认值是什么。这对我来说是出乎意料的。