如何使用 UIAppearance 设置 ViewController 的 backgroundColor

Posted

技术标签:

【中文标题】如何使用 UIAppearance 设置 ViewController 的 backgroundColor【英文标题】:How to set backgroundColor of a ViewController with UIAppearance 【发布时间】:2017-09-08 13:47:16 【问题描述】:

我正在尝试使用 UIAppearance 来配置我的应用程序的样式。它与 UIView 或 UIButton 等 UI 组件完美配合,但不适用于 UIViewControllers。我想做类似的事情:

let appearance = FirstViewController.appearance()

有没有办法将 UIAppearance 与 ViewControllers 一起使用?

【问题讨论】:

你可能需要视图控制器视图,只是一个猜测。 UIViewController 没有appearnace() UIViewcontroller 没有扩展 UIAppearnce 类,这样你就不能使用它了。 UIView 是 UIAppearnce 类的扩展。 我认为您将UIViewControllerUIView 混淆了。虽然 UIView 对于您的意图来说可能是一个太多的“基类”,但也许您可以 (1) 将 UIView 子类化,(2) 将您的 UIViewController 视图设置为该子类,以及 (3) 配置 UIAppearence为此。 嗨@dfd,我可以将自定义 UIView 指定为 UIViewController 的默认视图吗? 【参考方案1】:

正如您在UIAppearance 协议的documentation 中看到的,默认只有两个类采用它,UIViewUIBarItem,因此UIViewController 类没有appearance() 功能。

您可以通过实现协议所需的方法来扩展UIViewController,或者更简单的解决方案可能是创建您自己的UIViewController 子类,它为类view.backgroundColor 属性提供默认颜色并制作你所有的 ViewControllers 都继承自这个类,而不是直接继承 UIViewController

【讨论】:

【参考方案2】:

您不会在 viewController 中设置背景颜色,而是在 viewControllers view 中设置背景颜色。如果您使用UIView.appearance().backgroundColor,您将更改所有视图的背景。

因此,您的问题的答案是否定的,您不能使用 UIAppearance 更改 viewControllers 背景颜色。

你可以做的是:

class FirstViewController: UIViewController 
    override func viewDidLoad() 
        super.viewDidLoad()
        view.backgroundColor = .red
    

然后使用 Storyboard 中的检查器将 UIViewController 更改为 FirstViewController

【讨论】:

这不会影响所有视图,而不仅仅是视图控制器视图? @rmaddy,我不够清楚,认为这很明显,但现在已经澄清了答案。感谢您指出。 @rmaddy 这只影响视图控制器,在 Storyboard 检查器中,它的类分配给FirstViewControllerFirstViewController 的子类。一种用法是扩展默认的UINavigationController 并将背景设置为白色。所以右上角不会显示一闪而过的深灰色。 @John 我的评论适用于原始答案,而不是当前答案。【参考方案3】:

正如之前的答案所指出的,没有办法通过UIAppearance 协议更改UIViewController 的根视图背景。 但是有一些方法可以实现相同的结果,而无需让所有其他ViewControllers 继承一个根UIViewController 子类,或者在每个UIViewControllerviewDidLoad() 中设置颜色(两种方法都有其缺点)

您可以创建一个 UIView 子类

class BackgroundView: UIView 

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)

        // Set your background color
        self.backgroundColor = .black

        // Or, if your background is an image
        self.layer.contents = UIImage(named: "background")!.cgImage
    

在情节提要中,将ViewController 的根视图类设置为此 UIView 子类

同样的方法也适用于UITableViewController

class BackgroundTableView: UITableView 

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
[....]

【讨论】:

以上是关于如何使用 UIAppearance 设置 ViewController 的 backgroundColor的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UILabel 中删除 UIAppearance 设置?

使用 UIAppearance 设置视图控制器的直接视图背景颜色

不需要时如何摆脱 UIAppearance?

使用 UIAppearance 渲染图像

使用 UIAppearance 代理设置 UILabel 样式

我啥时候可以开始使用使用 UIAppearance 设置的属性?