案例一:實現(xiàn)全屏滑動
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"替換系統(tǒng)手勢";
NSArray *targetsArr = [self.navigationController.interactivePopGestureRecognizer valueForKey:@"targets"];
id target = [[targetsArr lastObject] valueForKey:@"target"];
SEL actionSEL = NSSelectorFromString(@"handleNavigationTransition:");
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:target action:actionSEL];
[self.view addGestureRecognizer:panGesture];
panGesture.delegate = self;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
return self.navigationController.childViewControllers.count != 1;
}
案例二:去掉導(dǎo)航欄下的線
UIView * backgroundView = [self.navigationBar subviews].firstObject;
UIView * navLine = [backgroundView.subviews firstObject];
navLine.hidden = YES;
案例三:隱藏tabbar
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
if (self.viewControllers.count > 0) {
//viewController是將要被push的控制器
viewController.hidesBottomBarWhenPushed = YES;
}
[super pushViewController:viewController animated:animated];
}
案例三:隱藏導(dǎo)航欄返回文字
//ios11 導(dǎo)致箭頭下偏
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(510, 550) forBarMetrics:UIBarMetricsDefault];
//可以采用如下方法
if (@available(iOS 11 ,*)) {
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-300, 0) forBarMetrics:UIBarMetricsDefault];
}else{
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -300) forBarMetrics:UIBarMetricsDefault];
}
案例四:改變狀態(tài)欄字體顏色
- (UIStatusBarStyle)preferredStatusBarStyle{
//白色
return UIStatusBarStyleLightContent;
}
案例五:隱藏返回按鈕
[self.navigationItem setHidesBackButton:YES animated:YES];
案例六:打開手勢
self.navigationController.interactivePopGestureRecognizer.delegate = self;
#pragma mark UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
return YES;
}
案例七:導(dǎo)航欄標(biāo)題字體顏色及其大小
self.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor colorWithHex:0x333333 alpha:1],NSFontAttributeName:[UIFont boldSystemFontOfSize:18]};
案例八:改變導(dǎo)航欄圖標(biāo)的顏色
self.navigationBar.tintColor = [UIColor colorWithHex:333333 alpha:1];
案例九:隱藏導(dǎo)航欄
第一種做法
-注意這里一定要用動畫的方式隱藏導(dǎo)航欄,這樣在使用滑動返回手勢的時候效果最好,和上面動圖一致.這樣做有一個缺點(diǎn)就是在切換tabBar的時候有一個導(dǎo)航欄向上消失的動畫.
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
第二種做法
設(shè)置self為導(dǎo)航控制器的代理,實現(xiàn)代理方法,在將要顯示控制器中設(shè)置導(dǎo)航欄隱藏和顯示,使用這種方式不僅完美切合滑動返回手勢,同時也解決了切換tabBar的時候,導(dǎo)航欄動態(tài)隱藏的問題.
@interface WLHomePageController () <UINavigationControllerDelegate>
@end
@implementation WLHomePageController
#pragma mark - lifeCycle
- (void)viewDidLoad {
[super viewDidLoad];
// 設(shè)置導(dǎo)航控制器的代理為self
self.navigationController.delegate = self;
}
#pragma mark - UINavigationControllerDelegate
// 將要顯示控制器
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
// 判斷要顯示的控制器是否是自己
BOOL isShowHomePage = [viewController isKindOfClass:[self class]];
[self.navigationController setNavigationBarHidden:isShowHomePage animated:YES];
}
案例十:UIScrollView手勢與側(cè)滑手勢沖突
NSArray *gestureArray = self.navigationController.view.gestureRecognizers;
for (UIGestureRecognizer *gestureRecognizer in gestureArray) {
if ([gestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
[_scrollView.panGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer];
}
}
案例十一:在UINavigationController的rootViewController上滑動返回時,會出現(xiàn)界面卡死的情況。在導(dǎo)航欄的基類中作如下處理。
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer == self.interactivePopGestureRecognizer) {
// 屏蔽調(diào)用rootViewController的滑動返回手勢
if (self.viewControllers.count < 2 || self.visibleViewController == [self.viewControllers objectAtIndex:0]) {
return NO;
}
}
return YES;
}