重新加载标签栏外观

Reloading tab bar appearance

我正在尝试在用户将应用程序的外观从浅色模式更改为深色模式后重新加载标签栏,反之亦然。我能够更新应用程序中除标签栏之外的所有内容。我不想强迫用户关闭应用程序。

您可以使用 tabBar.backgroundColor-属性:

设置 tabBar 的颜色
self?.tabBar.backgroundColor

请确保您正在主线程上更新背景颜色。

DispatchQueue.main.async { [weak self] in
   self?.tabBar.backgroundColor = newAppearanceColor
}

如果您尝试查看关于 UIAppearancedocs,您会看到注释:

iOS applies appearance changes when a view enters a window, it doesn’t change the appearance of a view that’s already in a window. To change the appearance of a view that’s currently in a window, remove the view from the view hierarchy and then put it back.

根据此说明,您可以通过删除小技巧来更改外观,并在对外观应用更改后立即退回层次结构中的最顶层视图:

guard let currentView = (UIApplication.shared.delegate as? AppDelegate)?.window?.rootViewController?.view,
    let superview = currentView.superview else { return }

UITabBar.appearance().tintColor = .green

currentView.removeFromSuperview()
superview.addSubview(currentView)

使用 iOS 13,您可以覆盖 UITabBarController 中的 traitCollectionDidChange(_:) 以进行更改。参见 documentation

示例:

class TabBarControllerViewController: UITabBarController {

    ...

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        self.tabBar.barTintColor = UIColor.red
        self.tabBar.unselectedItemTintColor = UIColor.darkGray
        self.tabBar.tintColor = UIColor.white
  }
}

我会说这里 none 的答案是正确的(在撰写本文时)。为视图分配颜色时,您只需确保设置了深色模式颜色,系统会在用户更改模式时自动更新它。

两个主要选项:

  1. 使用资产目录并确保外观设置为 'Any, Dark',设置两种颜色并将其分配给标签栏:

tabBar.backgroundColor = UIColor(named: "tabBarBackground")

  1. 或者您可以通过编程方式设置深色模式颜色:

tabBar.backgroundColor = UIColor.clear.withDarkModeColor(.black)