前言(可略)
有的頁面有導(dǎo)航欄愧薛,有的頁面又不要導(dǎo)航欄杯缺,同時又想手勢返回動畫流暢。
或許會采用以下方法:
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.navigationController.navigationBarHidden = YES;
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
self.navigationController.navigationBarHidden = NO;
}
這個方法有兩個問題:1.方法繁瑣匿醒;2.B界面手勢返回時,B界面導(dǎo)航欄消失缠导;
對與問題2廉羔,可以改用下面解決:
[self.navigationController setNavigationBarHidden:hiden animated:animated];
但又引入一個問題,當(dāng)AB界面都隱藏導(dǎo)航欄時僻造,導(dǎo)航欄有消失和出現(xiàn)的動畫憋他。如何解決就是我思考的問題了孩饼。
解決方案
step1:通過運(yùn)行時添加屬性shouldNavigationBarHidden
,標(biāo)識控制器是否需要隱藏導(dǎo)航欄
step2:自定義導(dǎo)航欄竹挡,對比shouldNavigationBarHidden
與導(dǎo)航欄navigationBarHidden
镀娶,不一致時隱藏導(dǎo)航欄
使用方法:
在ViewController的viewDidLoad
中設(shè)置
self.shouldNavigationBarHidden
即可。
注意:push
前設(shè)置view.backgroundColor
等view
相關(guān)內(nèi)容會導(dǎo)致viewDidLoad
提前的順序問題
代碼
@interface UIViewController (NavigationBarHidden)
/// 是否隱藏導(dǎo)航欄揪罕。默認(rèn)NO梯码。
@property (nonatomic , assign) BOOL shouldNavigationBarHidden;
@end
@interface HideNavigationController : UINavigationController<UINavigationControllerDelegate>
@end
#import "UIViewController+NavigationBarHidden.h"
#import <objc/runtime.h>
@implementation UIViewController (NavigationBarHidden)
- (BOOL)shouldNavigationBarHidden{
return [objc_getAssociatedObject(self, @selector(shouldNavigationBarHidden)) boolValue];
}
- (void)setShouldNavigationBarHidden:(BOOL)shouldNavigationBarHidden{
objc_setAssociatedObject(self, @selector(shouldNavigationBarHidden), @(shouldNavigationBarHidden), OBJC_ASSOCIATION_ASSIGN);
}
@end
@implementation HideNavigationController
- (void)viewDidLoad {
[super viewDidLoad];
self.delegate = self;
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
if (self.viewControllers.count > 0) {
viewController.hidesBottomBarWhenPushed = YES;
}
[super pushViewController:viewController animated:animated];
}
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (viewController.shouldNavigationBarHidden != self.navigationBarHidden) {
[self setNavigationBarHidden:viewController.shouldNavigationBarHidden animated:animated];
}
}
@end
對于隱藏了導(dǎo)航欄的控制器,手勢返回也消失了好啰⌒ⅲ可自定義手勢,在邊緣開始滑動時調(diào)用interactivePopGestureRecognizer
方法框往■悖可參考 iOS導(dǎo)航欄隱藏透明處理 && 側(cè)滑返回手勢