session-ios/Session/Shared/BaseVC.swift

103 lines
3.7 KiB
Swift

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()
}
}