在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)
行,布局是:
在.transition(.opacity)
行中,布局为:
答案 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()
}
}