Панель инструментов прыгает на месте, когда появляется вид

У меня есть представление с панелью инструментов внизу, к которой я перехожу с помощью . Но когда появляется представление, панель инструментов отображается слишком низко. Примерно через полсекунды он внезапно встает на место. Это происходит только в первый раз после запуска приложения. Если я вернусь к первому виду и снова запущу навигацию, он сразу же отобразится в правильном месте.

Вот файлы для воспроизведения:

КонтентВью:

      struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink {
                ToolbarView()
            } label: {
                Text("Hello, world!")
            }
        }
    }
} 

Панель инструментов:

      struct ToolbarView: View {
    var body: some View {
        ScrollView {
            VStack {
                Text("Text1")
                Text("Text2")
            }
        }
        .toolbar {
            ToolbarItemGroup(placement: .bottomBar) {
                
                Spacer()
                
                Button {
                } label: {
                    Image(systemName: "trash")                        
                }
            }
        }
    }
}

Это ошибка SwiftUI?

1 ответ

  1. Вы получите наихудший эффект на iOS 16 с вашим кодом, который вообще не отображает панель инструментов! Итак, сначала добавим указать стиль навигации, используя следующий модификатор наnavigationView:
      .navigationViewStyle(.stack)
  1. Если и первое, и второе представление не имеют одинаковых контейнеров, вы увидите неожиданные движения, поэтому вы можете добавить пустую панель инструментов для удержания места вnavigationLink:
      ToolbarItemGroup(placement: .bottomBar) { Spacer() }

Завершенный код будет:

      struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink {
                ToolbarView()
            } label: {
                Text("Hello, world!")
            }
            .toolbar {
                ToolbarItemGroup(placement: .bottomBar) { Spacer() }  // <- prevents main page jumpings
            }
        }
        .navigationViewStyle(.stack) // <- prevents detail page jumping
    }
}

Демо

Не беспокойтесь о макете RTL

Другие вопросы по тегам