Skip to content

Commit a977cbb

Browse files
committed
QMUITheme, 使用UIScreen的_setDefaultTraitCollection更准确
1 parent 1bc6018 commit a977cbb

1 file changed

Lines changed: 11 additions & 20 deletions

File tree

QMUIKit/UIKitExtensions/UITraitCollection+QMUI.m

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -59,22 +59,11 @@ + (void)_qmui_notifyUserInterfaceStyleWillChangeEvents:(UITraitCollection *)trai
5959
}
6060
}
6161

62-
+ (void)_qmui_notifyUserInterfaceStyleWithWindow:(UIWindow *)window {
63-
static UIUserInterfaceStyle currentUserInterfaceStyle;
64-
static NSSet<NSString *> *keyboardWindows;
65-
static dispatch_once_t onceToken;
66-
dispatch_once(&onceToken, ^{
67-
currentUserInterfaceStyle = UIUserInterfaceStyleUnspecified;
68-
keyboardWindows = [NSSet setWithArray:@[@"UIRemoteKeyboardWindow", @"UITextEffectsWindow", @"UITrackingWindowView"]];
69-
});
70-
71-
UITraitCollection *traitCollection = UIScreen.mainScreen.traitCollection;
62+
+ (void)_qmui_notifyUserInterfaceStyleWillChangeForTraitCollection:(UITraitCollection *)traitCollection {
63+
static UIUserInterfaceStyle currentUserInterfaceStyle = UIUserInterfaceStyleUnspecified;
7264
if (currentUserInterfaceStyle == traitCollection.userInterfaceStyle) {
7365
return;
7466
}
75-
if ([keyboardWindows containsObject:NSStringFromClass(window.class)] || window != UIApplication.sharedApplication.qmui_delegateWindow) {
76-
return;
77-
}
7867
currentUserInterfaceStyle = traitCollection.userInterfaceStyle;
7968

8069
[self _qmui_notifyUserInterfaceStyleWillChangeEvents:traitCollection];
@@ -83,16 +72,18 @@ + (void)_qmui_notifyUserInterfaceStyleWithWindow:(UIWindow *)window {
8372
+ (void)_qmui_overrideTraitCollectionMethodIfNeeded {
8473
[QMUIHelper executeBlock:^{
8574
/// https://github.com/Tencent/QMUI_iOS/issues/1634
86-
NSString *willTransitionSel = [NSString qmui_stringByConcat:@"_", @"willTransitionToTraitCollection:", @"withTransitionCoordinator:", nil];
87-
OverrideImplementation(UIWindow.class, NSSelectorFromString(willTransitionSel), ^id(__unsafe_unretained Class originClass, SEL originCMD, IMP (^originalIMPProvider)(void)) {
88-
return ^(UIWindow *selfObject, UITraitCollection *newCollection, id<UIViewControllerTransitionCoordinatorContext> coordinator) {
75+
NSString *willChangeTraitCollection = [NSString qmui_stringByConcat:@"_", @"setDefault", @"TraitCollection:", nil];
76+
OverrideImplementation([UIScreen class], NSSelectorFromString(willChangeTraitCollection), ^id(__unsafe_unretained Class originClass, SEL originCMD, IMP (^originalIMPProvider)(void)) {
77+
return ^(UIScreen *selfObject, UITraitCollection *traitCollection) {
8978

90-
[UITraitCollection _qmui_notifyUserInterfaceStyleWithWindow:selfObject];
79+
if (selfObject == UIScreen.mainScreen) {
80+
[UITraitCollection _qmui_notifyUserInterfaceStyleWillChangeForTraitCollection:traitCollection];
81+
}
9182

9283
// call super
93-
void (*originSelectorIMP)(id, SEL, UITraitCollection *, id<UIViewControllerTransitionCoordinatorContext>);
94-
originSelectorIMP = (void (*)(id, SEL, UITraitCollection *, id<UIViewControllerTransitionCoordinatorContext>))originalIMPProvider();
95-
originSelectorIMP(selfObject, originCMD, newCollection, coordinator);
84+
void (*originSelectorIMP)(id, SEL, UITraitCollection *);
85+
originSelectorIMP = (void (*)(id, SEL, UITraitCollection *))originalIMPProvider();
86+
originSelectorIMP(selfObject, originCMD, traitCollection);
9687
};
9788
});
9889
} oncePerIdentifier:@"UITraitCollection addUserInterfaceStyleWillChangeObserver"];

0 commit comments

Comments
 (0)