|
@@ -6,6 +6,9 @@
|
|
//
|
|
//
|
|
|
|
|
|
import Foundation
|
|
import Foundation
|
|
|
|
+import XCNotificationCenter
|
|
|
|
+
|
|
|
|
+fileprivate let kXCThemeManagerInterfaceStyleChangedNotifyKey = "kXCThemeManagerInterfaceStyleChangedNotifyKey"
|
|
|
|
|
|
@objc
|
|
@objc
|
|
@objcMembers
|
|
@objcMembers
|
|
@@ -61,14 +64,11 @@ public class XCThemeManager: NSObject {
|
|
}
|
|
}
|
|
loaded = true
|
|
loaded = true
|
|
|
|
|
|
- if let defaultThemeBlock = self.defaultThemeBlock,
|
|
|
|
- let defaultTheme = defaultThemeBlock() {
|
|
|
|
- self.selectedTheme = self.theme(forId: defaultTheme)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
let originalMethod = class_getInstanceMethod(UIViewController.classForCoder(), #selector(UIViewController.viewDidLoad))!
|
|
let originalMethod = class_getInstanceMethod(UIViewController.classForCoder(), #selector(UIViewController.viewDidLoad))!
|
|
let newMethod = class_getInstanceMethod(UIViewController.classForCoder(), #selector(UIViewController.XCThemeManagerSwizzledViewDidLoad))!
|
|
let newMethod = class_getInstanceMethod(UIViewController.classForCoder(), #selector(UIViewController.XCThemeManagerSwizzledViewDidLoad))!
|
|
method_exchangeImplementations(originalMethod, newMethod)
|
|
method_exchangeImplementations(originalMethod, newMethod)
|
|
|
|
+
|
|
|
|
+ self.setupDefaultTheme()
|
|
}
|
|
}
|
|
|
|
|
|
private func theme(forId id: String) -> XCThemeSpec? {
|
|
private func theme(forId id: String) -> XCThemeSpec? {
|
|
@@ -79,6 +79,13 @@ public class XCThemeManager: NSObject {
|
|
self.loadManagerIfNeeded()
|
|
self.loadManagerIfNeeded()
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public func setupDefaultTheme() {
|
|
|
|
+ if let defaultThemeBlock = self.defaultThemeBlock,
|
|
|
|
+ let defaultTheme = defaultThemeBlock() {
|
|
|
|
+ self.selectedTheme = self.theme(forId: defaultTheme)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
public var currentUserInterfaceStyle: UIUserInterfaceStyle {
|
|
public var currentUserInterfaceStyle: UIUserInterfaceStyle {
|
|
if let theme = self.selectedTheme {
|
|
if let theme = self.selectedTheme {
|
|
return theme.interfaceStyle
|
|
return theme.interfaceStyle
|
|
@@ -93,12 +100,12 @@ public class XCThemeManager: NSObject {
|
|
|
|
|
|
private func forceThemeInterfaceStyleForWindows() {
|
|
private func forceThemeInterfaceStyleForWindows() {
|
|
UIApplication.shared.connectedScenes
|
|
UIApplication.shared.connectedScenes
|
|
- .filter( {$0.activationState == .foregroundActive})
|
|
|
|
.map( {$0 as? UIWindowScene})
|
|
.map( {$0 as? UIWindowScene})
|
|
.forEach({ $0?.windows.forEach({
|
|
.forEach({ $0?.windows.forEach({
|
|
$0.overrideUserInterfaceStyle = self.currentUserInterfaceStyle
|
|
$0.overrideUserInterfaceStyle = self.currentUserInterfaceStyle
|
|
})
|
|
})
|
|
})
|
|
})
|
|
|
|
+ XCNotificationCenter.shared.post(notificationNamed: kXCThemeManagerInterfaceStyleChangedNotifyKey, attachedObject: self.currentUserInterfaceStyle)
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
@@ -108,6 +115,13 @@ fileprivate extension UIViewController {
|
|
@objc func XCThemeManagerSwizzledViewDidLoad() {
|
|
@objc func XCThemeManagerSwizzledViewDidLoad() {
|
|
self.XCThemeManagerSwizzledViewDidLoad()
|
|
self.XCThemeManagerSwizzledViewDidLoad()
|
|
XCThemeManager.shared.forceThemeInterfaceStyle(self)
|
|
XCThemeManager.shared.forceThemeInterfaceStyle(self)
|
|
|
|
+ XCNotificationCenter.shared.addObserver(self, forName: kXCThemeManagerInterfaceStyleChangedNotifyKey) {
|
|
|
|
+ [weak self] value in
|
|
|
|
+ guard let self = self else { return }
|
|
|
|
+ if let newStyle = value as? UIUserInterfaceStyle {
|
|
|
|
+ self.overrideUserInterfaceStyle = newStyle
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|