Swift中如何设置UIView背景?代码交互后异常问题求助
问题分析与解决方案
这个坑我之前踩过!你遇到的问题根源在于 UIView.appearance()会作用于所有UIView及其子类的实例——包括系统内部的各种底层视图,而不仅仅是你自己创建的视图。
为什么刚打开正常,交互后就全屏变蓝?
启动App时,只有最上层的核心视图会被渲染,那些系统内部的辅助视图(比如滚动视图的背景、导航栏的子视图、甚至窗口的底层容器视图)还没被触发加载。但当你进行交互(比如滚动、弹出弹窗、切换页面)时,这些系统视图会被动态创建/渲染,它们作为UIView的子类,会自动应用你设置的全局外观背景色,最终导致整个屏幕被蓝色覆盖。
解决方法分这几种:
只给特定自定义视图设置外观
如果你只是想让自己的自定义UIView变成蓝色,不要用全局的UIView.appearance(),而是针对你的自定义类设置:// 假设你的自定义视图叫MyCustomView MyCustomView.appearance().backgroundColor = .blue这样只会影响你自己创建的视图,系统视图不会被波及。
在自定义视图内部设置背景色
放弃全局外观设置,直接在自定义视图的初始化方法里指定背景色,这是最安全的方式:class MyCustomView: UIView { override init(frame: CGRect) { super.init(frame: frame) configureView() } required init?(coder: NSCoder) { super.init(coder: coder) configureView() } private func configureView() { backgroundColor = .blue } }限定外观的作用范围
如果你一定要用全局外观,可以用appearance(whenContainedInInstancesOf:)来指定只有在特定容器内的UIView才应用这个设置:// 只让你的ViewController里的UIView应用蓝色背景 UIView.appearance(whenContainedInInstancesOf: [YourTargetViewController.self]).backgroundColor = .blue这样系统视图不在你的目标容器里,就不会被修改。
内容的提问来源于stack exchange,提问作者Filippo Bertolina
相关产品推荐
相关产品推荐

