在 iOS 13 中,UITabBarItem 的 standardAppearance 应用于所有其他项目

Posted

技术标签:

【中文标题】在 iOS 13 中,UITabBarItem 的 standardAppearance 应用于所有其他项目【英文标题】:In iOS 13 UITabBarItem's standardAppearance is applied to all other items 【发布时间】:2019-10-22 01:29:02 【问题描述】:

我正在尝试在 ios 13 上做一件简单的事情 - 最后一个标签栏项目应始终以不同的颜色显示

我尝试使用新的UITabBarItem.standardAppearance 成员。这是我的代码:

// first, set the default colors for the whole tab bar
let color = Style.Color.tabItem
let text = [NSAttributedString.Key.foregroundColor: color]
let selectedColor = Style.Color.tabItemSelected
let selectedText = [NSAttributedString.Key.foregroundColor: selectedColor]

let barAppearance = UITabBarItemAppearance()

barAppearance.normal.iconColor = color
barAppearance.disabled.iconColor = color
barAppearance.selected.iconColor = selectedColor
barAppearance.focused.iconColor = selectedColor

barAppearance.normal.titleTextAttributes = text
barAppearance.disabled.titleTextAttributes = text
barAppearance.selected.titleTextAttributes = selectedText
barAppearance.focused.titleTextAttributes = selectedText

tabBar.standardAppearance.stackedLayoutAppearance = barAppearance
tabBar.standardAppearance.inlineLayoutAppearance = barAppearance
tabBar.standardAppearance.compactInlineLayoutAppearance = barAppearance
tabBar.standardAppearance.backgroundColor = Style.Color.tabBar

// now, for the last item set special colors
if let lastItem = tabBar.items?.last 
    let specialColor = Style.Color.tabItemSpecial
    let specialText = [NSAttributedString.Key.foregroundColor: specialColor]
    let specialSelectedColor = Style.Color.tabItemSpecialSelected
    let specialSelectedText = [NSAttributedString.Key.foregroundColor: specialSelectedColor]

    let itemAppearance = UITabBarItemAppearance()

    itemAppearance.normal.iconColor = specialColor
    itemAppearance.disabled.iconColor = specialColor
    itemAppearance.selected.iconColor = specialSelectedColor
    itemAppearance.focused.iconColor = specialSelectedColor

    itemAppearance.normal.titleTextAttributes = specialText
    itemAppearance.disabled.titleTextAttributes = specialText
    itemAppearance.selected.titleTextAttributes = specialSelectedText
    itemAppearance.focused.titleTextAttributes = specialSelectedText

    let itemBarAppearance = UITabBarAppearance()

    itemBarAppearance.stackedLayoutAppearance = itemAppearance
    itemBarAppearance.inlineLayoutAppearance = itemAppearance
    itemBarAppearance.compactInlineLayoutAppearance = itemAppearance
    itemBarAppearance.backgroundColor = Style.Color.tabBar

    lastItem.standardAppearance = itemBarAppearance

预期行为:

所有标签项ALWAYStabItem/tabItemSelected颜色显示,最后一个标签项ALWAYStabItemSpecial/tabItemSpecialSelected颜色显示.

实际行为:

当除了最后一个之外选择了任何项目时 - 所有标签项都显示在tabItem / tabItemSelected,包括最后一个! 当我选择最后一个标签栏项目时,它的standardAppearance 样式也应用于TO ALL其他标签栏项目!所以他们都使用tabItemSpecial/tabItemSpecialSelected配色方案。

我做错了吗?或者我误解了新的 API,没有办法让一个标签栏项始终具有不同的颜色?

【问题讨论】:

基本上我会说不要尝试使用带有标签栏的新 UIBarAppearance 东西。它破坏了标签栏的整体外观。我可以给你写一个我发现的错误列表,但是页边距太小,无法容纳它。 【参考方案1】:

这是预期的行为。您不是在自定义特定标签栏项目的外观,而是在自定义当该项目是当前选定的项目时标签栏的显示方式。

【讨论】:

但是官方文档却极具误导性。首先,它说它取代了旧的外观 API,您可以在其中将选定的图像设置为单独的选项卡项。其次,developer.apple.com/documentation/uikit/uitabbaritem/… 字面意思是“standardAppearance - 此特定标签栏项目的外观设置。”。第三,描述说“如果这个属性的值不是 nil,UIKit 在显示 THE ITEM 时使用这个属性中的设置。” 该描述是正确的——当standardAppearance 不为零时,UIKit 在显示该项目时使用这些设置。请记住,UITabBarAppearance 是 UITabBar 的外观,而不是 UITabBarItem 的外观(这就是 UITabBarItemAppearance 的含义)。很可能这可以更清楚地解释,但这里的上下文是 UITabBarAppearance 描述的不仅仅是 UITabBarItem 的外观属性。如果它像您假设的那样工作,那么歧义将是未使用背景和布局属性的原因。 那么您是说 Apple 使用新 API 限制了功能,并且无法像以前那样将单个图像放入选项卡项?我简直不敢相信。 新 API 的构造方式,不允许您独立自定义每个 UTabBarItem。这并不意味着它不可能(因为您仍然可以使用旧的自定义 API,尽管它的限制不同)。反馈报告适合这种情况。

以上是关于在 iOS 13 中,UITabBarItem 的 standardAppearance 应用于所有其他项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 4 中更改 UITabBarItem 中文本的颜色

在 iOS 9 中更改 UITabBarItem 色调颜色?

在 iOS 7 中无法显示 UITabBarItem.image 正确大小

iOS - 获取 UITabBarItem 的 UIImageView/UIImage 的框架

为啥这个 UITabBarItem 图像切换代码在 iOS 7 上有效,而在 iOS 7.1 上无效?

UITabBar 在 iOS7 上更改一个 UITabBarItem 的背景颜色