UITabBarAppearance 不适用于 iOS15 iPad(标题颜色)

UITabBarAppearance does not work on iOS15 iPad (title color)

我创建了一个简单的demo,只创建了一个UITabBarController的子类并在故事板中设置。

我想将 TabBarButtonItem 的标题在选中时设置为橙色,在正常时设置为黑色。以下代码在 iPhone 上的任何 iOS 版本上工作正常,但在 iOS 15 的 iPad(设备和模拟器)上,所选颜色变为蓝色和有线正常状态颜色.

这是 Apple 的错误还是我遗漏了什么?(我正在使用 Xcode13)

class CustomViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let tabBarAppearnace = UITabBarAppearance()
        let tabFont =  UIFont.boldSystemFont(ofSize: 18)
        
        let selectedAttributes: [NSAttributedString.Key: Any]
        = [NSAttributedString.Key.font: tabFont, NSAttributedString.Key.foregroundColor: UIColor.orange]
        let normalAttributes: [NSAttributedString.Key: Any]
        = [NSAttributedString.Key.font: tabFont, NSAttributedString.Key.foregroundColor: UIColor.black]
        
        tabBarAppearnace.stackedLayoutAppearance.normal.titleTextAttributes = normalAttributes
        tabBarAppearnace.stackedLayoutAppearance.selected.titleTextAttributes = selectedAttributes
        
        tabBar.standardAppearance = tabBarAppearnace
    }
}

对于 iPadOS 你必须使用 inlineLayoutAppearance 属性,因为在 iPad TabBar 中的项目默认内联显示(标题和图标是并排显示)。
但实际上您还应该配置 compactInlineLayoutAppearance,否则如果您在 iPhone 上使用横向模式,您的自定义样式将不适用。

class CustomViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let tabBarAppearnace = UITabBarAppearance()
        let tabFont =  UIFont.boldSystemFont(ofSize: 18)
        
        let selectedAttributes: [NSAttributedString.Key: Any]
        = [NSAttributedString.Key.font: tabFont, NSAttributedString.Key.foregroundColor: UIColor.orange]
        let normalAttributes: [NSAttributedString.Key: Any]
        = [NSAttributedString.Key.font: tabFont, NSAttributedString.Key.foregroundColor: UIColor.black]
        
        tabBarAppearnace.stackedLayoutAppearance.normal.titleTextAttributes = normalAttributes
        tabBarAppearnace.stackedLayoutAppearance.selected.titleTextAttributes = selectedAttributes
        
        //New        
        tabBarAppearnace.inlineLayoutAppearance.normal.titleTextAttributes = normalAttributes
        tabBarAppearnace.inlineLayoutAppearance.selected.titleTextAttributes = selectedAttributes

        tabBarAppearnace.compactInlineLayoutAppearance.normal.titleTextAttributes = normalAttributes
        tabBarAppearnace.compactInlineLayoutAppearance.selected.titleTextAttributes = selectedAttributes


        tabBar.standardAppearance = tabBarAppearnace
    }
}

更多信息:https://developer.apple.com/documentation/uikit/uitabbarappearance

如果有人感兴趣,你也可以在 iOS 15, Xcode 13:

的故事板中实现
  • 在故事板中,突出显示标签栏
  • 打开 Inspector(Xcode window 右上角的按钮)
  • 打开属性检查器(三个滑动条)
  • 在标签栏下,选中外观框:标准 and/or 滚动边缘

  • 然后向下滚动并找到标准布局外观
  • 将堆叠选项设置为自定义
  • 现在您应该会看到标准堆叠布局外观属性
  • 将状态配置设置为正常,确保设置标题和图标颜色。
  • 然后也将状态更改为选中并设置标题和图标颜色。

现在我们需要为 iPad

配置内联布局

所以现在我们需要对内联布局做同样的事情,在属性检查器的同一部分中,您将内联 属性,将该选项更改为自定义。并像上面的步骤一样设置。

我建议您也对紧凑内联布局执行相同的操作。

如果您使用故事板而不是对其进行编码,那么您可能还需要考虑配置滚动边缘外观,您将不得不重复复制我们刚刚为滚动边缘外观的标准外观所做的一切。