如何统一设置整个App的背景颜色?能否在SceneDelegate中实现?
统一设置iOS App全局背景色的几种方案
嘿,这个问题问得好!确实可以在一处统一搞定整个App的背景色,不用每个页面都重复写代码。下面给你几种靠谱的方案,其中SceneDelegate里的设置是最直接贴合你需求的:
方案1:直接在SceneDelegate中设置窗口背景色
所有视图控制器都是依托UIWindow展示的,所以给窗口设置背景色后,只要视图控制器的view没有单独设置背景(或者设为透明),就会自动显示窗口的背景色,完美实现“一处设置全局生效”。
代码示例(放在SceneDelegate的scene(_:willConnectTo:options:)方法里):
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: windowScene) self.window = window // 这里设置你想要的全局背景色 window.backgroundColor = .systemGray6 // 初始化并设置根视图控制器 let rootVC = YourRootViewController() window.rootViewController = rootVC window.makeKeyAndVisible() }
小提示:如果某个页面需要特殊背景色,直接给该页面的
view.backgroundColor赋值即可,会自动覆盖窗口的背景色。
方案2:利用UIAppearance统一设置所有ViewController的背景
如果你希望每个视图控制器的view本身就带有统一背景色,可以用UIKit的外观代理(Appearance)来实现,同样可以在SceneDelegate里一次性设置:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // 先设置全局视图的默认背景色 UIView.appearance(whenContainedInInstancesOf: [UIViewController.self]).backgroundColor = .systemGray6 // 下面是常规的窗口初始化代码 guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: windowScene) self.window = window let rootVC = YourRootViewController() window.rootViewController = rootVC window.makeKeyAndVisible() }
这个方法会让所有UIViewController的view默认使用你设置的背景色,同样支持单个页面单独修改覆盖。
方案3:自定义基类ViewController(适合长期维护的项目)
如果你的App之后可能需要添加更多全局统一样式(比如导航栏样式、默认字体等),自定义一个基类ViewController是更灵活的选择:
首先创建一个基类:
class BaseViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 统一设置背景色 view.backgroundColor = .systemGray6 // 这里还可以添加其他全局样式,比如导航栏设置、默认手势等 } }
然后让你所有的业务视图控制器都继承这个BaseViewController:
class HomeViewController: BaseViewController { // 你的页面代码 }
这种方式的好处是,后续所有全局样式的修改都只需要在基类里调整,不用再去每个页面改动,扩展性极强。
内容的提问来源于stack exchange,提问作者Szymon W
相关产品推荐
相关产品推荐

