如何更改 tvOS 13 中选项卡的背景颜色?
How to change background color for tab in tvOS 13?
TvOS 13. 我有一个带标签的 UITabBarController。并且可以自定义几乎所有东西,除了这个显而易见的东西:焦点选项卡的背景。它总是白色的。
Guide 告诉
Specify tints for selected and unselected items
我试过了:
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()
没有任何帮助。
对于@davidv 和其他人,这是我的解决方案:
extension UIView {
func subviews<T:UIView>(ofType type: T.Type) -> [T] {
var result = self.subviews.compactMap { [=10=] 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 { [=10=].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
在研究了 UITabBar 和 UITabBarController 的各种属性后,我终于弄明白了。
更改焦点项目背景颜色的 属性 是 UITabBarAppearance
的 selectionIndicatorTintColor
(documentation)。
由于它在 tvOS >= 13.0 上可用,因此您必须像这样包装作业:
if #available(tvOS 13.0, *) {
tabBar.standardAppearance.selectionIndicatorTintColor = .white
}
我通过 UITabBar
扩展实现了这一点。显示在焦点上的视图包含一个 UIMotionEffect
,因此我们检查它以找到它。
@available(tvOS 13.0, *)
extension UITabBar {
var focusBackgroundView: UIView? {
let allSubviews: [UIView] = subviews.flatMap { [[=10=]] + [=10=].subviews as [UIView] }
return allSubviews.first{ ![=10=].motionEffects.isEmpty }
}
}
用法:
myTabBar.focusBackgroundView.backgroundColor = .red
Specify tints for selected and unselected items
我试过了:
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()
没有任何帮助。
对于@davidv 和其他人,这是我的解决方案:
extension UIView {
func subviews<T:UIView>(ofType type: T.Type) -> [T] {
var result = self.subviews.compactMap { [=10=] 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 { [=10=].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
在研究了 UITabBar 和 UITabBarController 的各种属性后,我终于弄明白了。
更改焦点项目背景颜色的 属性 是 UITabBarAppearance
的 selectionIndicatorTintColor
(documentation)。
由于它在 tvOS >= 13.0 上可用,因此您必须像这样包装作业:
if #available(tvOS 13.0, *) {
tabBar.standardAppearance.selectionIndicatorTintColor = .white
}
我通过 UITabBar
扩展实现了这一点。显示在焦点上的视图包含一个 UIMotionEffect
,因此我们检查它以找到它。
@available(tvOS 13.0, *)
extension UITabBar {
var focusBackgroundView: UIView? {
let allSubviews: [UIView] = subviews.flatMap { [[=10=]] + [=10=].subviews as [UIView] }
return allSubviews.first{ ![=10=].motionEffects.isEmpty }
}
}
用法:
myTabBar.focusBackgroundView.backgroundColor = .red