如何使用 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 类的扩展。
我认为您将UIViewController
与UIView
混淆了。虽然 UIView
对于您的意图来说可能是一个太多的“基类”,但也许您可以 (1) 将 UIView
子类化,(2) 将您的 UIViewController
视图设置为该子类,以及 (3) 配置 UIAppearence
为此。
嗨@dfd,我可以将自定义 UIView 指定为 UIViewController 的默认视图吗?
【参考方案1】:
正如您在UIAppearance
协议的documentation 中看到的,默认只有两个类采用它,UIView
和UIBarItem
,因此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 检查器中,它的类分配给FirstViewController
或FirstViewController
的子类。一种用法是扩展默认的UINavigationController
并将背景设置为白色。所以右上角不会显示一闪而过的深灰色。
@John 我的评论适用于原始答案,而不是当前答案。【参考方案3】:
正如之前的答案所指出的,没有办法通过UIAppearance
协议更改UIViewController
的根视图背景。
但是有一些方法可以实现相同的结果,而无需让所有其他ViewControllers
继承一个根UIViewController
子类,或者在每个UIViewController
的viewDidLoad()
中设置颜色(两种方法都有其缺点)
您可以创建一个 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 设置视图控制器的直接视图背景颜色