我试图在SwiftUI中创建一个简单的动画,我希望动画从中间开始,从顶部开始,最后到屏幕的中心。
但是,正如您在视频中看到的,当我使用NavigationView时,动画从左上角开始:

下面是我在这个示例中使用的代码:
struct ContentView: View {
@State var show = false
var body: some View {
NavigationView {
HStack {
Text("Hello, world!")
.padding()
.background(Color.blue)
.offset(x: 0, y: show ? 0 : -30)
.animation(Animation.easeOut.delay(0.6))
.onAppear {
self.show = true
}
.navigationTitle("Why?")
}
}
}
}发布于 2020-11-21 16:56:59
为什么NavigationView中的动画从左上角开始?
因为隐式动画会影响所有可动画的属性,包括位置,这在创建时间上是CGPoint.zero (即。左上角)
这种情况是通过将动画链接到依赖状态值来解决的,因此只有在状态发生变化时才会激活,因此所有可动画的属性都不会受到影响。
这里是您的情况的可能变体。用Xcode 12.1 / iOS 14.1测试。
struct ContentView: View {
@State var show = false
var body: some View {
GeometryReader { gp in
NavigationView {
HStack {
Text("Hello, world!")
.padding()
.background(Color.blue)
.offset(x: 0, y: show ? 0 : -gp.size.height / 2)
.animation(Animation.easeOut.delay(0.6), value: show)
.onAppear {
self.show = true
}
.navigationTitle("Why?")
}
}
}
}
}发布于 2020-11-22 08:50:40
因此,解决方案是在动画上使用value参数,它可以工作:
struct ContentView: View {
@State var show = false
var body: some View {
NavigationView {
HStack {
Text("Hello, world!")
.padding()
.background(Color.blue)
.offset(x: 0, y: show ? 0 : -120)
.animation(Animation.easeOut.delay(0.6), value: show)
.onAppear {
self.show = true
}
.navigationTitle("Why?")
}
}
}
}发布于 2022-03-29 11:37:41
可以用self.show = true用DispatchQueue.main.async包装。如下所示:
.onAppear {
DispatchQueue.main.async {
self.show = true
}
}https://stackoverflow.com/questions/64945040
复制相似问题