【问题标题】:How to set backgroundColor of a ViewController with UIAppearance如何使用 UIAppearance 设置 ViewController 的 backgroundColor
【发布时间】: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 的默认视图吗?

标签: ios swift uiviewcontroller uiappearance uibackgroundcolor


【解决方案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)
    [....]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多