Как изменить цвет фона для вкладки в tvOS 13? - PullRequest
1 голос
/ 10 октября 2019

enter image description here TvOS 13. У меня есть UITabBarController с вкладками. И может настроить практически все, кроме этой очевидной вещи: фон фокусированной вкладки. Это всегда белое. Руководство говорит

Укажите оттенки для выбранных и невыбранных элементов

Я пытался:

view.backgroundColor = .purple
tabBar.tintColor = .yellow
tabBar.barTintColor = .red
tabBar.unselectedItemTintColor = .brown
tabBar.backgroundColor = .green
tabBar.backgroundImage = UIColor.blue.toImage()
tabBar.shadowImage = UIColor.orange.toImage()
tabBar.selectionIndicatorImage = UIColor.burgundy.toImage()

Ничего не помогло.

Ответы [ 3 ]

2 голосов
/ 22 октября 2019

Немного поиграв с различными свойствами UITabBar и UITabBarController, я наконец-то понял это.

Свойство для изменения цвета фона целевых элементов имеет значение selectionIndicatorTintColor из UITabBarAppearance ( документация ).

Так как он доступен в tvOS> = 13.0, вам нужно будет обернуть назначение следующим образом:

if #available(tvOS 13.0, *) {
    tabBar.standardAppearance.selectionIndicatorTintColor = .white
}
1 голос
/ 22 октября 2019

Для @davidv и других людей вот мое решение:

extension UIView {
    func subviews<T:UIView>(ofType type: T.Type) -> [T] {
        var result = self.subviews.compactMap { $0 as? T }
        for sub in self.subviews {
            result.append(contentsOf: sub.subviews(ofType: type))
        }
        return result
    }
}

extension UIViewController {
    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        // перекраска кнопки
        let allSubviews = tabBar.subviews(ofType: UIView.self)
        let whiteSubviews = allSubviews.filter { $0.backgroundColor == .white }
        for s in whiteSubviews {
            s.backgroundColor = .gold
        }
    }
}

ОБНОВЛЕНИЕ:

Для раскрашивания текста:

item.setTitleTextAttributes([NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: colorSelected], for: [.focused])
item.setTitleTextAttributes([NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: colorSelected], for: [.highlighted])
item.setTitleTextAttributes([NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: colorUnselected], for: [.normal])

Для раскраски фона:

tabBar.standardAppearance.selectionIndicatorTintColor = .gold
0 голосов
/ 06 ноября 2019

Я выполняю это через расширение UITabBar. Представление, отображаемое в фокусе, содержит UIMotionEffect, поэтому мы проверяем его, чтобы найти его.

@available(tvOS 13.0, *)
extension UITabBar {

    var focusBackgroundView: UIView? {
        let allSubviews: [UIView] = subviews.flatMap { [$0] + $0.subviews as [UIView] }
        return allSubviews.first{ !$0.motionEffects.isEmpty }
    }

}

Использование:

myTabBar.focusBackgroundView.backgroundColor = .red
...