[Xcode 14.1, iOS 16.1] У меня есть NavigationStack с navigationTitle и TabView с двумя представлениями. Каждый вид имеет ScrollView (см. изображение ниже):
Изображение проблемы NavigationStack и TabView
Когда я нажимаю на Tab1 (#1 на изображении выше красным), а затем смахиваю вверх, поведение соответствует ожидаемому (#2), т. е. большой заголовок навигации перемещается в центр, и мое представление проходит ниже и становится размытым. Идеальный. Однако, когда я нажимаю на Tab2 (#3), а затем смахиваю вверх (#4), большой заголовок остается большим, и вид не становится размытым. Затем я снова нажимаю на Tab1 (# 5), и он работает, как и ожидалось.
Пожалуйста помоги!
Вот мой код:
КонтентВью:
import SwiftUI
struct ContentView: View {
@State private var selection: Tab = .tab1
enum Tab {
case tab1
case tab2
}
@State private var mainTitle = "Tab1"
var body: some View {
NavigationStack {
TabView(selection: $selection) {
Tab1(mainTitle: $mainTitle)
.tabItem {
Label("Tab1", systemImage: "wrench.adjustable.fill")
}
.tag(Tab.tab1)
Tab2(mainTitle: $mainTitle)
.tabItem {
Label("Tab2", systemImage: "wrench.adjustable.fill")
}
.tag(Tab.tab2)
} .navigationTitle(mainTitle)
}
}
}
Вкладка 1:
import SwiftUI
struct Tab1: View {
@Binding var mainTitle : String
var body: some View {
ScrollView {
Text("Text tab 1")
.padding(.all,100)
.background(.blue)
} .onAppear {
mainTitle = "Tab1"
}
}
}
Вкладка 2:
import SwiftUI
struct Tab2: View {
@Binding var mainTitle : String
var body: some View {
ScrollView {
Text("Text tab 2")
.padding(.all,100)
.background(.green)
} .onAppear {
mainTitle = "Tab2"
}
}
}
Я попробовал хак, который должен исправить ошибку прозрачности для панелей вкладок, но он не работает.
.onAppear {
let tabBarAppearance = UITabBarAppearance()
tabBarAppearance.configureWithOpaqueBackground()
UITabBar.appearance().scrollEdgeAppearance = tabBarAppearance
}
Спасибо. Я делал это неправильно.
TabView
предназначены для того, чтобы находиться на вершине навигационной иерархии. Они предназначены для того, чтобы пользователи могли переключаться между независимыми разделами вашего приложения в любое время.
Обычно вы размещаете отдельный стек навигации на каждой вкладке, который затем обрабатывает нажатие и выталкивание представлений. Затем вы можете использовать модификатор navigationTitle
для управления заголовком экрана.
Таким образом, ваша структура (которая может быть разделена на несколько пользовательских представлений) должна выглядеть примерно так:
TabView {
NavigationStack {
ScrollView {
}
.navigationTitle("Tab 1")
}
.tabItem { Label("Tab1", ...) }
NavigationStack {
ScrollView {
}
.navigationTitle("Tab 2")
}
.tabItem { Label("Tab2", ...) }
}
Эта структура спроектирована так, чтобы соответствовать Руководству Apple по человеческому интерфейсу. Стоит прочитать HIG, чтобы понять, откуда взялась Apple, и как работа по одним и тем же принципам действительно может помочь вашему приложению чувствовать себя так, как будто оно принадлежит устройствам ваших пользователей.
Каждая вкладка получает свой собственный стек навигации, представление вкладки должно быть в самом верху приложения.