Skip to content

Commit 3725ad5

Browse files
authored
fix bug of iOS 14 beta 6 navigation bar weird behavior. (#157)
1 parent 12deea2 commit 3725ad5

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

KMNavigationBarTransition/UINavigationBar+KMNavigationBarTransition.m

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
// THE SOFTWARE.
2323

2424
#import "UINavigationBar+KMNavigationBarTransition.h"
25+
#import "UINavigationBar+KMNavigationBarTransition_internal.h"
26+
#import "KMWeakObjectContainer.h"
2527
#import <objc/runtime.h>
2628
#import "KMSwizzle.h"
2729

@@ -35,6 +37,13 @@ + (void)load {
3537
@selector(layoutSubviews),
3638
[self class],
3739
@selector(km_layoutSubviews));
40+
// fix the bug of iOS14 beta 6
41+
if (@available(iOS 14.0, *)) {
42+
KMSwizzleMethod([self class],
43+
NSSelectorFromString(@"_accessibility_navigationController"),
44+
[self class],
45+
@selector(km_accessibility_navigationController));
46+
}
3847
});
3948
}
4049
#endif
@@ -55,4 +64,24 @@ - (void)setKm_isFakeBar:(BOOL)hidden {
5564
objc_setAssociatedObject(self, @selector(km_isFakeBar), @(hidden), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
5665
}
5766

67+
- (UINavigationController *) km_accessibility_navigationController {
68+
UINavigationController * navigationController = [self km_accessibility_navigationController];
69+
if (self.km_isFakeBar) {
70+
// if it's fake navigation bar
71+
// return previously bound navigationController.
72+
return self.km_fakeController;
73+
}
74+
return navigationController;
75+
}
76+
77+
- (UINavigationController *)km_fakeController
78+
{
79+
return km_objc_getAssociatedWeakObject(self, @selector(km_fakeController));
80+
}
81+
82+
- (void)setKm_fakeController:(UINavigationController *)km_fakeController
83+
{
84+
km_objc_setAssociatedWeakObject(self, @selector(km_fakeController), km_fakeController);
85+
}
86+
5887
@end

KMNavigationBarTransition/UINavigationBar+KMNavigationBarTransition_internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,7 @@
2626
@interface UINavigationBar (KMNavigationBarTransition_internal)
2727

2828
@property (nonatomic, assign) BOOL km_isFakeBar;
29+
// store current navigation controller.
30+
@property (nonatomic, weak) UINavigationController *km_fakeController;
2931

3032
@end

KMNavigationBarTransition/UIViewController+KMNavigationBarTransition.m

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ - (void)km_addTransitionNavigationBarIfNeeded {
128128
[self km_adjustScrollViewContentOffsetIfNeeded];
129129
UINavigationBar *bar = [[UINavigationBar alloc] init];
130130
bar.km_isFakeBar = YES;
131+
if (@available(iOS 14.0, *)) {
132+
bar.km_fakeController = self.navigationController;
133+
}
131134
bar.barStyle = self.navigationController.navigationBar.barStyle;
132135
if (bar.translucent != self.navigationController.navigationBar.translucent) {
133136
bar.translucent = self.navigationController.navigationBar.translucent;

0 commit comments

Comments
 (0)