Есть ли способ анимировать элементы навигационной панели с помощью withAnimation(…?

По какой-то причине SwiftUi withAnimation не работает в модификаторе navigationBarItems. Есть ли исправление для этого? Я знаю модификатор .animation для анимированных работ, но этого недостаточно для более сложных анимаций.

Мне было интересно, что никто не задавал этот вопрос раньше, я предполагаю, что у большего количества людей есть проблема. Кто-нибудь знает, как исправить это?

Вот один пример: https://drive.google.com/file/d/1d2Ud2xxhVCJBCfBQwlZ1mJgTnyNpxc_/view?usp=sharing

      
    struct TestView: View {
    
      @State var red = true
    
      var body: some View {
        NavigationView {

            VStack {
                HStack {
                    Rectangle()
                        .fill(red ? Color.red : .blue)
                        .onTapGesture {
                         
                         
                         withAnimation(Animation.easeIn(duration: 1), {
                                
                            red.toggle()
                            })
                        }
                    
                }
                
                
                Spacer()
                
            }
            
            
                
            .navigationTitle("Test")
            .navigationBarItems(leading:
                                    HStack {
                                        Rectangle()
                                            .fill(red ? Color.red : .blue)
                                            .onTapGesture {
                                             
                                             
                                             withAnimation(Animation.easeIn(duration: 1), {
                                                    
                                                red.toggle()
                                                })
                                            }
                                    }
                                    
            )
        }
        
       }
    }


    struct TestView_Previews: PreviewProvider {
    
      static var previews: some View {
        TestView()
      }
    }
    

    ```


  

1 ответ

Возможное решение - разделить этот зависимый от состояния анимируемый код в автономное представление, как показано ниже.

Протестировано с Xcode 12.4 / iOS 14.4

      struct TestBarAnimationView: View {

      @State var red = true

      var body: some View {
        NavigationView {
            VStack {
                RectView(red: $red)       // << here !!
                Spacer()
            }
            .navigationTitle("Test")
            .navigationBarItems(leading:
                RectView(red: $red)       // << here !!
            )
        }

       }
    }


struct RectView: View {
    @Binding var red: Bool

    var body: some View {
        HStack {
             Rectangle()
                  .fill(red ? Color.red : .blue)
                  .onTapGesture {
                    withAnimation(Animation.easeIn(duration: 1), {
                        red.toggle()
                        })
                  }
        }
    }
}
Другие вопросы по тегам