Swift中如何为所有视图控制器设置统一背景图(替代复制粘贴)
哈哈,复制粘贴代码确实太麻烦了,而且后期要改背景图或者调整样式的话,得一个个VC改,超级低效!给你两个常用的优雅方案,选哪个看你的需求:
方案1:给UIViewController写扩展(灵活度高)
把设置背景图的逻辑封装成扩展方法,这样任何VC都能按需调用:
extension UIViewController { func setupGlobalBackground() { let bgImageView = UIImageView() bgImageView.image = UIImage(named: "bg_name.png") bgImageView.contentMode = .scaleAspectFill bgImageView.translatesAutoresizingMaskIntoConstraints = false // 把背景图插到最底层,不影响其他控件 view.insertSubview(bgImageView, at: 0) // 用AutoLayout适配所有屏幕和旋转场景 NSLayoutConstraint.activate([ bgImageView.topAnchor.constraint(equalTo: view.topAnchor), bgImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), bgImageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), bgImageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) } }
使用的时候,只需要在VC的viewDidLoad里加一行:
override func viewDidLoad() { super.viewDidLoad() setupGlobalBackground() // 其他业务逻辑... }
方案2:自定义基类ViewController(统一管理)
如果你的大部分VC都需要这个背景图,直接建一个基类,所有需要背景的VC继承它就行,连调用都省了:
class BaseBackgroundVC: UIViewController { override func viewDidLoad() { super.viewDidLoad() setupGlobalBackground() } private func setupGlobalBackground() { let bgImageView = UIImageView() bgImageView.image = UIImage(named: "bg_name.png") bgImageView.contentMode = .scaleAspectFill bgImageView.translatesAutoresizingMaskIntoConstraints = false view.insertSubview(bgImageView, at: 0) NSLayoutConstraint.activate([ bgImageView.topAnchor.constraint(equalTo: view.topAnchor), bgImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor), bgImageView.trailingAnchor.constraint(equalTo: view.trailingAnchor), bgImageView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) } } // 你的业务VC直接继承基类 class ProfileViewController: BaseBackgroundVC { override func viewDidLoad() { super.viewDidLoad() // 这里写你的VC逻辑,背景图已经自动设置好了 } }
额外优化小技巧
- 如果背景图是固定不变的,可以提前把
UIImage缓存起来,避免每次都从Bundle加载:// 可以在扩展或者基类里定义一个静态属性 private static let cachedBackgroundImage = UIImage(named: "bg_name.png") - 如果担心背景图覆盖导航栏或者tabbar,可以根据VC的
edgesForExtendedLayout调整约束,或者给背景图加对应的inset。
内容的提问来源于stack exchange,提问作者Eric Chong
相关产品推荐
相关产品推荐

