Измените цвет Tabview в зависимости от того, какая вкладка выбрана -Swiftui

#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. Это решение сбросит положение прокрутки и любое другое состояние. Не то, что вы ожидаете от просмотра вкладок. Пожалуйста, добавьте эту информацию в свой ответ.