SwiftUI - 在嵌套视图上使用不同的转换

len*_*nny 11 transition ios swiftui

如何在 SwiftUI 中拥有一个覆盖视图,并在不同部分具有不同的过渡?例如,在我的具体示例中,我想实现以下目标:

  • 覆盖视图的一个子视图从底部滑入
  • 覆盖视图的另一个子视图根本没有过渡(立即出现)
  • 叠加层的背景不是从底部滑入而是淡入

我已经尝试过各种各样的事情,看来我必须在包装条件的视图上设置动画和过渡if showOverlay。但是,看起来覆盖层子视图上设置的所有.transition()和修饰符都被忽略了。.animation()

实际上可能吗?以下代码是我认为应该可以工作但显然根本不起作用的代码:

// any observable external variable, that enables / disables the overlay
@State showOverlay: bool = false

// surrounding view
VStack { /* .. */ }
  .frame(maxWidth: .infinity, maxHeight: .infinity)
  .overlay(
    Group {
      if showOverlay {
        Overlay()
      }
    }
  )

// overlay view
struct Overlay: View {
  var body: some View {
     VStack {
        // style 1
        Text("OverlayContent that slides in from bottom")
           .transition(.move(edge: .bottom).combined(with: .opacity))
           .animation(.easeInOut(duration: 0.28))
        // style 2
        Text("OverlayContent that appears instant")
           .animation(nil)
     }
     .background( // style 3
       Color.black.opacity(0.2)
         .ignoresSafeArea()
         .transition(.opacity) // <-- background should not slide up but fade in
     )
  }
}
Run Code Online (Sandbox Code Playgroud)