SwiftUI — Использование различных переходов во вложенных представлениях

#ios #swiftui #transition

Вопрос:

Как у меня может быть наложенный вид в 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
     )
  }
}
 

Комментарии:

1. Переход работает, когда появляется или исчезает явное представление (с модификатором перехода)… любой родитель, дети или брат или сестра не имеют к этому отношения.

2. Таким образом, тот вид анимации, который я ищу, просто невозможен, за исключением того, что я каким-то образом создаю каждый элемент, имеющий .transition внутри свой собственный условный блок?