首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么NavigationView中的动画从左上角开始?

为什么NavigationView中的动画从左上角开始?
EN

Stack Overflow用户
提问于 2020-11-21 15:52:47
回答 4查看 1.6K关注 0票数 10

我试图在SwiftUI中创建一个简单的动画,我希望动画从中间开始,从顶部开始,最后到屏幕的中心。

但是,正如您在视频中看到的,当我使用NavigationView时,动画从左上角开始:

下面是我在这个示例中使用的代码:

代码语言:javascript
复制
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?")
            }
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-11-21 16:56:59

为什么NavigationView中的动画从左上角开始?

因为隐式动画会影响所有可动画的属性,包括位置,这在创建时间上是CGPoint.zero (即。左上角)

这种情况是通过将动画链接到依赖状态值来解决的,因此只有在状态发生变化时才会激活,因此所有可动画的属性都不会受到影响。

这里是您的情况的可能变体。用Xcode 12.1 / iOS 14.1测试。

代码语言:javascript
复制
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?")
                    }
            }
        }
    }
}
票数 5
EN

Stack Overflow用户

发布于 2020-11-22 08:50:40

因此,解决方案是在动画上使用value参数,它可以工作:

代码语言:javascript
复制
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?")
            }
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2022-03-29 11:37:41

可以用self.show = true用DispatchQueue.main.async包装。如下所示:

代码语言:javascript
复制
.onAppear {
    DispatchQueue.main.async {
        self.show = true
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64945040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档