HBDNavigationBar icon indicating copy to clipboard operation
HBDNavigationBar copied to clipboard

问题1:hbd_barHidden隐藏导航栏问题;问题2:进入A页面,在A的ViewWillAppear中直接push到B(隐藏导航栏)中时,B中的view会多出一个导航栏的高度

Open leblanc-zx opened this issue 4 years ago • 2 comments

这两个问题,我解决了,作者可以看看是否有必要更新。 问题1:hbd_barHidden隐藏导航栏问题,在当前页面加载出来之后,来回切换hbd_barHidden的值后,导航栏样式与原有的预期不符,修改方案如下 增加三个临时变量,并修改setHbd_barHidden方法

@interface UIViewController (HBD)

@property (nonatomic, strong) NSArray *hbd_leftBarButtonItems; @property (nonatomic, strong) UIView *hbd_titleView; @property (nonatomic, strong) NSArray *hbd_rightBarButtonItems;

@end

@implementation UIViewController (HBD)

  • (void)setHbd_barHidden:(BOOL)hidden { if (hidden) { self.hbd_leftBarButtonItems = self.navigationItem.leftBarButtonItems; self.hbd_titleView = self.navigationItem.titleView; self.hbd_rightBarButtonItems = self.navigationItem.rightBarButtonItems; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[UIView new]]; self.navigationItem.titleView = [UIView new]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[UIView new]]; } else { self.navigationItem.leftBarButtonItems = self.hbd_leftBarButtonItems; self.navigationItem.titleView = self.hbd_titleView; self.navigationItem.rightBarButtonItems = self.hbd_rightBarButtonItems; self.hbd_leftBarButtonItems = nil; self.hbd_titleView = nil; self.hbd_rightBarButtonItems = nil; } objc_setAssociatedObject(self, @selector(hbd_barHidden), @(hidden), OBJC_ASSOCIATION_COPY_NONATOMIC); }

  • (NSArray *)hbd_leftBarButtonItems { return objc_getAssociatedObject(self, _cmd); }

  • (void)setHbd_leftBarButtonItems:(NSArray *)leftBarButtonItems { objc_setAssociatedObject(self, @selector(hbd_leftBarButtonItems), leftBarButtonItems, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }

  • (UIView *)hbd_titleView { return objc_getAssociatedObject(self, _cmd); }

  • (void)setHbd_titleView:(UIView *)titleView { objc_setAssociatedObject(self, @selector(hbd_titleView), titleView, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }

  • (NSArray *)hbd_rightBarButtonItems { return objc_getAssociatedObject(self, _cmd); }

  • (void)setHbd_rightBarButtonItems:(NSArray *)rightBarButtonItems { objc_setAssociatedObject(self, @selector(hbd_rightBarButtonItems), rightBarButtonItems, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }

@end

问题2:进入A页面,在A的ViewWillAppear中直接push到B页面,B页面设置的hbd_barHidden=YES,此时B页面导航栏虽然隐藏,但是导航栏的高度依然存在,解决方案如下 经测试找到最终原因,这种情况下,代码先走了HBDNavigationController中的- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated方法,这里的viewController是B,后才走B的viewDidLoad方法,然而hbd_barHidden=YES是在B的viewDidLoad方法中设置的,此时adjustLayout调用的时机就出错了。解决方案如下 在UIViewController+HBD中增加对viewWillAppear:的hock,在viewWillAppear:中去调用adjustLayout,移除HBDNavigationController中willShowViewController中调用adjustLayout

void hbd_swizzle(Class oldClass, NSString *oldSelector, Class newClass) { NSString *newSelector = [NSString stringWithFormat:@"hbd_%@", oldSelector]; Method old = class_getInstanceMethod(oldClass, NSSelectorFromString(oldSelector)); Method new = class_getInstanceMethod(newClass, NSSelectorFromString(newSelector)); method_exchangeImplementations(old, new); }

@implementation UIViewController (HBD)

+(void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (@available(iOS 11.0, *)) { NSArray <NSString *>*oriSels = @[@"viewWillAppear:"]; [oriSels enumerateObjectsUsingBlock:^(NSString * _Nonnull oriSel, NSUInteger idx, BOOL * _Nonnull stop) { hbd_swizzle(self, oriSel, self); }]; } }); }

  • (void)hbd_viewWillAppear:(BOOL)animated { [self hbd_viewWillAppear:animated]; if (self.hbd_extendedLayoutDidSet == NO) { self.hbd_extendedLayoutDidSet = YES; adjustLayout(self); } }

@end

leblanc-zx avatar Jan 09 '21 03:01 leblanc-zx

楼主牛皮,我也遇到了问题2,盼望作者能及时修改

lavender1026 avatar Apr 14 '21 03:04 lavender1026

@lavender1026 请提供一个demo

listenzz avatar Apr 14 '21 04:04 listenzz