SettingsViewController.swift 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // LoopFollow
  2. // SettingsViewController.swift
  3. import Combine
  4. import SwiftUI
  5. import UIKit
  6. final class SettingsViewController: UIViewController {
  7. // MARK: Stored properties
  8. private var host: UIHostingController<SettingsMenuView>!
  9. private var cancellables = Set<AnyCancellable>()
  10. // MARK: Life-cycle
  11. override func viewDidLoad() {
  12. super.viewDidLoad()
  13. // Build SwiftUI menu
  14. host = UIHostingController(rootView: SettingsMenuView())
  15. // Appearance mode override
  16. host.overrideUserInterfaceStyle = Storage.shared.appearanceMode.value.userInterfaceStyle
  17. // Listen for appearance setting changes
  18. Storage.shared.appearanceMode.$value
  19. .receive(on: DispatchQueue.main)
  20. .sink { [weak self] mode in
  21. self?.updateAppearance(mode)
  22. }
  23. .store(in: &cancellables)
  24. // Listen for system appearance changes (when in System mode)
  25. NotificationCenter.default.publisher(for: .appearanceDidChange)
  26. .receive(on: DispatchQueue.main)
  27. .sink { [weak self] _ in
  28. self?.updateAppearance(Storage.shared.appearanceMode.value)
  29. }
  30. .store(in: &cancellables)
  31. // Embed
  32. addChild(host)
  33. host.view.translatesAutoresizingMaskIntoConstraints = false
  34. view.addSubview(host.view)
  35. NSLayoutConstraint.activate([
  36. host.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
  37. host.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
  38. host.view.topAnchor.constraint(equalTo: view.topAnchor),
  39. host.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
  40. ])
  41. host.didMove(toParent: self)
  42. }
  43. override func viewWillAppear(_ animated: Bool) {
  44. super.viewWillAppear(animated)
  45. Observable.shared.settingsPath.set(NavigationPath())
  46. }
  47. override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
  48. super.traitCollectionDidChange(previousTraitCollection)
  49. if Storage.shared.appearanceMode.value == .system,
  50. previousTraitCollection?.userInterfaceStyle != traitCollection.userInterfaceStyle
  51. {
  52. updateAppearance(.system)
  53. }
  54. }
  55. private func updateAppearance(_ mode: AppearanceMode) {
  56. host.overrideUserInterfaceStyle = mode.userInterfaceStyle
  57. }
  58. }