@@ -26,32 +26,63 @@ + (void)load {
2626 static dispatch_once_t onceToken;
2727 dispatch_once (&onceToken, ^{
2828
29- #ifdef IOS15_SDK_ALLOWED
3029 if (@available (iOS 15.0 , *)) {
31- ExtendImplementationOfVoidMethodWithSingleArgument ([UINavigationBar class ], @selector (setStandardAppearance: ), UINavigationBarAppearance *, ^(UINavigationBar *selfObject, UINavigationBarAppearance *appearance) {
32- if (selfObject.qmuinb_copyStylesToBar ) {
33- selfObject.qmuinb_copyStylesToBar .standardAppearance = appearance;
34- }
30+
31+ OverrideImplementation ([UINavigationBar class ], @selector (setStandardAppearance: ), ^id (__unsafe_unretained Class originClass, SEL originCMD, IMP (^originalIMPProvider)(void )) {
32+ return ^(UINavigationBar *selfObject, UINavigationBarAppearance *appearance) {
33+
34+ // call super
35+ void (*originSelectorIMP)(id , SEL , UINavigationBarAppearance *);
36+ originSelectorIMP = (void (*)(id , SEL , UINavigationBarAppearance *))originalIMPProvider ();
37+ originSelectorIMP (selfObject, originCMD, appearance);
38+
39+ if (selfObject.qmuinb_copyStylesToBar ) {
40+ selfObject.qmuinb_copyStylesToBar .standardAppearance = appearance;
41+ }
42+ };
3543 });
3644
37- ExtendImplementationOfVoidMethodWithSingleArgument ([UINavigationBar class ], @selector (setScrollEdgeAppearance: ), UINavigationBarAppearance *, ^(UINavigationBar *selfObject, UINavigationBarAppearance *appearance) {
38- if (selfObject.qmuinb_copyStylesToBar ) {
39- selfObject.qmuinb_copyStylesToBar .scrollEdgeAppearance = appearance;
40- }
45+ OverrideImplementation ([UINavigationBar class ], @selector (setScrollEdgeAppearance: ), ^id (__unsafe_unretained Class originClass, SEL originCMD, IMP (^originalIMPProvider)(void )) {
46+ return ^(UINavigationBar *selfObject, UINavigationBarAppearance *appearance) {
47+
48+ // call super
49+ void (*originSelectorIMP)(id , SEL , UINavigationBarAppearance *);
50+ originSelectorIMP = (void (*)(id , SEL , UINavigationBarAppearance *))originalIMPProvider ();
51+ originSelectorIMP (selfObject, originCMD, appearance);
52+
53+ if (selfObject.qmuinb_copyStylesToBar ) {
54+ selfObject.qmuinb_copyStylesToBar .standardAppearance = appearance;
55+ }
56+ };
4157 });
4258 }
43- #endif
4459
45- ExtendImplementationOfVoidMethodWithSingleArgument ([UINavigationBar class ], @selector (setBarStyle: ), UIBarStyle, ^(UINavigationBar *selfObject, UIBarStyle barStyle) {
46- if (selfObject.qmuinb_copyStylesToBar && selfObject.qmuinb_copyStylesToBar .barStyle != barStyle) {
47- selfObject.qmuinb_copyStylesToBar .barStyle = barStyle;
48- }
60+ OverrideImplementation ([UINavigationBar class ], @selector (setBarStyle: ), ^id (__unsafe_unretained Class originClass, SEL originCMD, IMP (^originalIMPProvider)(void )) {
61+ return ^(UINavigationBar *selfObject, UIBarStyle barStyle) {
62+
63+ // call super
64+ void (*originSelectorIMP)(id , SEL , UIBarStyle);
65+ originSelectorIMP = (void (*)(id , SEL , UIBarStyle))originalIMPProvider ();
66+ originSelectorIMP (selfObject, originCMD, barStyle);
67+
68+ if (selfObject.qmuinb_copyStylesToBar && selfObject.qmuinb_copyStylesToBar .barStyle != barStyle) {
69+ selfObject.qmuinb_copyStylesToBar .barStyle = barStyle;
70+ }
71+ };
4972 });
5073
51- ExtendImplementationOfVoidMethodWithSingleArgument ([UINavigationBar class ], @selector (setBarTintColor: ), UIColor *, ^(UINavigationBar *selfObject, UIColor *barTintColor) {
52- if (selfObject.qmuinb_copyStylesToBar && ![selfObject.qmuinb_copyStylesToBar.barTintColor isEqual: barTintColor]) {
53- selfObject.qmuinb_copyStylesToBar .barTintColor = barTintColor;
54- }
74+ OverrideImplementation ([UINavigationBar class ], @selector (setBarTintColor: ), ^id (__unsafe_unretained Class originClass, SEL originCMD, IMP (^originalIMPProvider)(void )) {
75+ return ^(UINavigationBar *selfObject, UIColor *barTintColor) {
76+
77+ // call super
78+ void (*originSelectorIMP)(id , SEL , UIColor *);
79+ originSelectorIMP = (void (*)(id , SEL , UIColor *))originalIMPProvider ();
80+ originSelectorIMP (selfObject, originCMD, barTintColor);
81+
82+ if (selfObject.qmuinb_copyStylesToBar && ![selfObject.qmuinb_copyStylesToBar.barTintColor isEqual: barTintColor]) {
83+ selfObject.qmuinb_copyStylesToBar .barTintColor = barTintColor;
84+ }
85+ };
5586 });
5687
5788 OverrideImplementation ([UINavigationBar class ], @selector (setBackgroundImage:forBarMetrics: ), ^id (__unsafe_unretained Class originClass, SEL originCMD, IMP (^originalIMPProvider)(void )) {
@@ -68,10 +99,18 @@ + (void)load {
6899 };
69100 });
70101
71- ExtendImplementationOfVoidMethodWithSingleArgument ([UINavigationBar class ], @selector (setShadowImage: ), UIImage *, ^(UINavigationBar *selfObject, UIImage *firstArgv) {
72- if (selfObject.qmuinb_copyStylesToBar ) {
73- selfObject.qmuinb_copyStylesToBar .shadowImage = firstArgv;
74- }
102+ OverrideImplementation ([UINavigationBar class ], @selector (setShadowImage: ), ^id (__unsafe_unretained Class originClass, SEL originCMD, IMP (^originalIMPProvider)(void )) {
103+ return ^(UINavigationBar *selfObject, UIImage *shadowImage) {
104+
105+ // call super
106+ void (*originSelectorIMP)(id , SEL , UIImage *);
107+ originSelectorIMP = (void (*)(id , SEL , UIImage *))originalIMPProvider ();
108+ originSelectorIMP (selfObject, originCMD, shadowImage);
109+
110+ if (selfObject.qmuinb_copyStylesToBar ) {
111+ selfObject.qmuinb_copyStylesToBar .shadowImage = shadowImage;
112+ }
113+ };
75114 });
76115
77116 OverrideImplementation ([UINavigationBar class ], @selector (setQmui_effect: ), ^id (__unsafe_unretained Class originClass, SEL originCMD, IMP (^originalIMPProvider)(void )) {
@@ -211,6 +250,8 @@ - (void)setOriginalNavigationBar:(UINavigationBar *)originBar {
211250 // 只复制当前 originBar 的样式,所以复制完立马就清空
212251 originBar.qmuinb_copyStylesToBar = self;
213252 originBar.qmuinb_copyStylesToBar = nil ;
253+
254+ [self updateLayout ];
214255}
215256
216257- (void )layoutSubviews {
@@ -228,4 +269,13 @@ - (void)didAddSubview:(UIView *)subview {
228269 }
229270}
230271
272+ - (void )updateLayout {
273+ if ([self .parentViewController isViewLoaded ] && self.originalNavigationBar ) {
274+ [self .parentViewController.view bringSubviewToFront: self ];
275+ UIView *backgroundView = self.originalNavigationBar .qmui_backgroundView ;
276+ CGRect rect = [backgroundView.superview convertRect: backgroundView.frame toView: self .parentViewController.view];
277+ self.frame = CGRectSetX (rect, 0 );// push/pop 过程中系统的导航栏转换过来的 x 可能是 112、-112
278+ }
279+ }
280+
231281@end
0 commit comments