#ios #swift #swiftui #uitabbar #tabview
#iOS #swift #swiftui #uitabbar #tabview
Вопрос:
Я пытаюсь посмотреть, могу ли я изменить цвет нижнего tabview в зависимости от того, какой элемент вкладки выбран. В настоящее время я могу очистить панель tabview с помощью приведенного ниже кода при инициализации.
let tabBar = UITabBar.appearance()
init() {
tabBar.barTintColor = UIColor.clear
tabBar.backgroundImage = UIImage()
tabBar.shadowImage = UIImage()
}
...
TabView(selection: $selectedTab) {
FirstView()
.tabItem{
Text("First")
}
SecondView()
.tabItem{
Text("Second")
}
}
.onAppear{
setTabViewBackground()
}
func setTabViewBackground() {
if selectedTab != 0 {
tabBar.barTintColor = UIColor.blue
}
}
Пытался просто запустить функцию при перерисовке тела и idk, если этот декларативный стиль мне нравится, но фон tabview вообще не меняется.
Комментарии:
1. Вы можете расширить UITabBarController, чтобы заставить это работать. Примерно на полпути вниз по этой странице находится ссылка на то, как это сделать. Ищите код после «Новый способ: появление UITabBarAppearance», schwiftyui.com/swiftui/customizing-your-tabviews-bar-in-swiftui
2. Я начал с этой статьи, но получал странные результаты с Xcode 12. В итоге я просто создал свой собственный tabview в виде набора кнопок, которые изменяют привязку, которая условно запускает 4 других представления. В нем намного меньше кода, чем в статье, но мне было интересно, есть ли какой-либо реальный недостаток.
Ответ №1:
Любой из них .appearance
влияет на экземпляры, созданные после самого внешнего вида. Таким образом, решение заключается в повторном создании TabView
после изменения конфигурации внешнего вида.
Вот демонстрация подхода. Протестировано с Xcode 12 / iOS 14.
struct DemoView: View {
let tabBar = UITabBar.appearance()
init() {
tabBar.barTintColor = UIColor.red
}
@State private var selectedTab = 0 // preserves selected tab
var body: some View {
TabView(selection: $selectedTab) {
Text("FirstView")
.tabItem{
Text("First")
}.tag(0)
Text("SecondView")
.tabItem{
Text("Second")
}.tag(1)
}
.onAppear {
setTabViewBackground() // called, because `id` is below
}
.id(selectedTab) // recreates entire above view with new tabbar
}
func setTabViewBackground() {
tabBar.barTintColor = selectedTab != 0 ? .blue : .red
}
}
Комментарии:
1. @Asperi это работает, но, похоже, это портит сами компоненты вкладки. они не загружаются должным образом с этим
2. Это решение сбросит положение прокрутки и любое другое состояние. Не то, что вы ожидаете от просмотра вкладок. Пожалуйста, добавьте эту информацию в свой ответ.