class BaseVC : UIViewController { private var hasGradient = false override var preferredStatusBarStyle: UIStatusBarStyle { return isLightMode ? .default : .lightContent } lazy var navBarTitleLabel: UILabel = { let result = UILabel() result.textColor = Colors.text result.font = .boldSystemFont(ofSize: Values.veryLargeFontSize) result.alpha = 1 result.textAlignment = .center return result }() lazy var crossfadeLabel: UILabel = { let result = UILabel() result.textColor = Colors.text result.font = .boldSystemFont(ofSize: Values.veryLargeFontSize) result.alpha = 0 result.textAlignment = .center return result }() override func viewDidLoad() { setNeedsStatusBarAppearanceUpdate() NotificationCenter.default.addObserver(self, selector: #selector(handleAppModeChangedNotification(_:)), name: .appModeChanged, object: nil) } internal func ensureWindowBackground() { let appMode = AppModeManager.shared.currentAppMode switch appMode { case .light: UIApplication.shared.delegate?.window??.backgroundColor = .white case .dark: UIApplication.shared.delegate?.window??.backgroundColor = .black } } internal func setUpGradientBackground() { hasGradient = true view.backgroundColor = .clear let gradient = Gradients.defaultBackground view.setGradient(gradient) } internal func setUpNavBarStyle() { guard let navigationBar = navigationController?.navigationBar else { return } if #available(iOS 15.0, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = Colors.navigationBarBackground appearance.shadowColor = .clear navigationBar.standardAppearance = appearance; navigationBar.scrollEdgeAppearance = navigationBar.standardAppearance } else { navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) navigationBar.shadowImage = UIImage() navigationBar.isTranslucent = false navigationBar.barTintColor = Colors.navigationBarBackground } } internal func setNavBarTitle(_ title: String, customFontSize: CGFloat? = nil) { let container = UIView() navBarTitleLabel.text = title crossfadeLabel.text = title if let customFontSize = customFontSize { navBarTitleLabel.font = .boldSystemFont(ofSize: customFontSize) crossfadeLabel.font = .boldSystemFont(ofSize: customFontSize) } container.addSubview(navBarTitleLabel) navBarTitleLabel.pin(to: container) container.addSubview(crossfadeLabel) crossfadeLabel.pin(to: container) navigationItem.titleView = container } internal func setUpNavBarSessionIcon() { let logoImageView = UIImageView() logoImageView.image = #imageLiteral(resourceName: "SessionGreen32") logoImageView.contentMode = .scaleAspectFit logoImageView.set(.width, to: 32) logoImageView.set(.height, to: 32) navigationItem.titleView = logoImageView } deinit { NotificationCenter.default.removeObserver(self) } override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { NotificationCenter.default.post(name: .appModeChanged, object: nil) } @objc internal func handleAppModeChangedNotification(_ notification: Notification) { if hasGradient { setUpGradientBackground() // Re-do the gradient } ensureWindowBackground() } }