你可以在消失时为 SwiftUI 视图设置动画吗?

Posted

技术标签:

【中文标题】你可以在消失时为 SwiftUI 视图设置动画吗?【英文标题】:Can you animate a SwiftUI View on disappear? 【发布时间】:2021-01-21 16:30:15 【问题描述】:

我有一个 SwiftUI View,它有一个运行 onAppear 的自定义动画。我也试图让视图动画onDisappear,但它立即消失了。

以下示例重现了该问题 - MyText 视图应从左侧滑入并向右滑出。 id 修饰符用于确保每次值更改时都会呈现一个新视图,并且我已经确认 onAppearonDisappear 确实每次都被调用,但动画 onDisappear 从未明显运行。我怎样才能做到这一点?

struct Survey: View 
  @State private var id = 0

  var body: some View 
    VStack 
      MyText(text: "\(id)").id(id)

      Button("Increment") 
        self.id += 1
      
    
  

  struct MyText: View 
    @State private var offset: CGFloat = -100
    let text: String

    var body: some View 
      return Text(text)
        .offset(x: offset)
        .onAppear() 
          withAnimation(.easeInOut(duration: 2)) 
            self.offset = 0
          
        
        .onDisappear() 
          withAnimation(.easeInOut(duration: 2)) 
            self.offset = 100
          
        
    
  

【问题讨论】:

【参考方案1】:

可能你想要过渡,比如

struct Survey: View 
  @State private var id = 0

  var body: some View 
    VStack 
      MyText(text: $id)

      Button("Increment") 
        self.id += 1
      
    
  

  struct MyText: View 
    @Binding var text: Int
    

    var body: some View 
      return Text("\(text)").id(text)
            .frame(maxWidth: .infinity)
            .transition(.slide)
            .animation(.easeInOut(duration: 2))
    
  

【讨论】:

干得好! :) 但是,关于这个问题,严格来说,这太糟糕了,这在 2021 年的 SwiftUI 中仍然无法原生提供。 也作为后续问题......在子视图中使用绑定有什么好处?无论哪种方式,它似乎都有效。【参考方案2】:

恐怕它无法工作,因为一旦隐藏视图就会调用 .onDisappear 修饰符。 但是这里有一个很好的答案: Is there a SwiftUI equivalent for viewWillDisappear(_:) or detect when a view is about to be removed?

【讨论】:

以上是关于你可以在消失时为 SwiftUI 视图设置动画吗?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 动画过渡

xCode 在渐变渐变时为视图设置动画

SwiftUI 动画滑入和滑出

SwiftUI 没有隐藏动画

SwiftUI:自定义模态动画

滚动时为值设置动画