Анимация скрытия NavigationView на SwiftUI

У меня есть HStack, который отвечает за строку поиска. При нажатии на него срабатывает метод navigationBarHidden, который скрывает NavigationView без анимации (это хорошо видно, когда мы выходим из состояния поиска и видим, как HStack пролетает поверх заголовка):

Анимация

Однако мне нужно использовать какой-то другой метод, чтобы изменить стиль NavigationBar на .inline, как это сделано у Apple (я предполагаю, что это сделано так, но утверждать мне не хватает знаний, так как я всего пару дней пишу на iOS):

Анимация

Вот код View:

import SwiftUI

struct Messages: View {
    @State private var searchText = ""
    @State private var showCancelButton: Bool = false

    var body: some View {
        NavigationView {
            VStack {
                HStack {
                    HStack {
                        Image(systemName: "magnifyingglass")

                        TextField("Поиск по сообщениям", text: $searchText, onEditingChanged: { isEditing in
                            self.showCancelButton = true
                        }, onCommit: {}).foregroundColor(.primary)

                        Button(action: {
                            self.searchText = ""
                        }) {
                            Image(systemName: "xmark.circle.fill").opacity(searchText == "" ? 0 : 1)
                        }
                    }
                    .padding(EdgeInsets(top: 8, leading: 6, bottom: 8, trailing: 6))
                    .foregroundColor(.secondary)
                    .background(Color(.secondarySystemBackground))
                    .cornerRadius(10.0)

                    if showCancelButton  {
                        Button("Отменить") {
                                UIApplication.shared.endEditing(true)
                                self.searchText = ""
                                self.showCancelButton = false
                        }
                        .foregroundColor(Color(.systemBlue))
                    }
                }
                .padding(.horizontal)
                .navigationBarHidden(showCancelButton)
                .animation(.default)

                List {
                    MessageCell()
                }
                .navigationBarTitle(Text("Сообщения"))
                .animation(.default)
                .resignKeyboardOnDragGesture()
            }
        }
    }
}



struct Messages_Previews: PreviewProvider {
    static var previews: some View {
        Group {
           Messages()
              .environment(\.colorScheme, .light)
        }
    }
}

extension UIApplication {
    func endEditing(_ force: Bool) {
        self.windows
            .filter{$0.isKeyWindow}
            .first?
            .endEditing(force)
    }
}

struct ResignKeyboardOnDragGesture: ViewModifier {
    var gesture = DragGesture().onChanged{_ in
        UIApplication.shared.endEditing(true)
    }
    func body(content: Content) -> some View {
        content.gesture(gesture)
    }
}

extension View {
    func resignKeyboardOnDragGesture() -> some View {
        return modifier(ResignKeyboardOnDragGesture())
    }
}

Помогите разобраться со скрытием NavigationView и прикручиванием к этому красивой анимации.


Ответы (0 шт):