標籤:ios 導航 微博 部落格
貓貓分享,必須精品
原創文章,歡迎轉載。轉載請註明:翟乃玉的部落格
地址:http://blog.csdn.net/u013357243
一:效果
第二篇裡面寫了怎樣自訂navigation實現自訂的導航控制器左右按鈕樣式,但是當我們自己實現後,系統內建的向右邊滑動來實現回退的功能就不能用了。
這裡主要實現滑動回退功能
。
二:代碼實現思路
首先 在 NYNavigationController.m中放一個popDelegate來放置要更改的手勢代理對象
@interface NYNavigationController ()<UINavigationControllerDelegate>@property (nonatomic, strong) id popDelegate;@end
重寫 UINavigationControllerDelegate 的方法- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
viewDidLoad中設定代理方法,並且預先設定手勢代理用來還原
- (void)viewDidLoad { [super viewDidLoad]; //記住手勢代理 用來還原 _popDelegate = self.interactivePopGestureRecognizer.delegate; self.delegate = self;}
//導航控制器跳轉完成的控制器- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{ if (viewController == self.viewControllers[0]) { // 是根控制器 //還原手勢代理 self.interactivePopGestureRecognizer.delegate = _popDelegate; }else{ // 非根控制器 //設定手勢代理為空白,就可以實現滑動了 //實現滑動返回功能 //清空滑動返回手勢的代理,就能實現滑動返回功能了。 self.interactivePopGestureRecognizer.delegate = nil; }}
三: 全部navigationController的代碼
內部包括設定左右按鈕等等功能
//// NYNavigationController.m// 貓貓微博//// Created by apple on 15-7-29.// Copyright (c) 2015年 znycat. All rights reserved.//#import "NYNavigationController.h"#import "UIBarButtonItem+Item.h"@interface NYNavigationController ()<UINavigationControllerDelegate>@property (nonatomic, strong) id popDelegate;@end@implementation NYNavigationController+ (void)initialize{ // 擷取當前類下面的UIBarButtonItem UIBarButtonItem *item = [UIBarButtonItem appearanceWhenContainedIn:self, nil]; // 設定導航條按鈕的文字顏色 為黃色 NSMutableDictionary *titleAttr = [NSMutableDictionary dictionary]; titleAttr[NSForegroundColorAttributeName] = [UIColor orangeColor]; [item setTitleTextAttributes:titleAttr forState:UIControlStateNormal];}- (void)viewDidLoad { [super viewDidLoad]; //記住手勢代理 用來還原 _popDelegate = self.interactivePopGestureRecognizer.delegate; self.delegate = self;}-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{ [super pushViewController:viewController animated:animated]; // 設定非根控制器導航條內容 if (self.viewControllers.count != 0) { //非根控制器 //設定導航條的內容 //設定導航條左邊和右邊 //如果把導航條上的返回按鈕覆蓋了,那麼就沒有了滑動返回功能 //設定左邊按鈕 viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"navigationbar_back"] highImage:[UIImage imageNamed:@"navigationbar_back_highlighted"] target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; //設定右邊按鈕 viewController.navigationItem.rightBarButtonItem = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"navigationbar_more"] highImage:[UIImage imageNamed:@"navigationbar_more_highlighted"] target:self action:@selector(backToRoot ) forControlEvents:UIControlEventTouchUpInside]; }}-(void)backToPre{ //返回上一個控制器 [self popViewControllerAnimated:YES];}-(void)backToRoot{ //返回根控制器 [self popToRootViewControllerAnimated:YES];}#pragma mark - UINavigationControllerDelegate 實現滑動回退功能//導航控制器跳轉完成的控制器- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{ if (viewController == self.viewControllers[0]) { // 是根控制器 //還原手勢代理 self.interactivePopGestureRecognizer.delegate = _popDelegate; }else{ // 非根控制器 //設定手勢代理為空白,就可以實現滑動了 //實現滑動返回功能 //清空滑動返回手勢的代理,就能實現滑動返回功能了。 self.interactivePopGestureRecognizer.delegate = nil; }}@end
四:注意
設定手勢代理為空白後必須要在該用的時候給設定回去,系統內部東西不能隨便亂改,要麼會出現難以預料的bug。在跟控制器的時候不小心做了回退滑動那樣的操作會讓再次進入下一個頁面的導航控制器的右邊按鈕點擊無效,app就崩潰了。
self.interactivePopGestureRecognizer.delegate = nil;
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
貓貓學iOS 之微博項目實戰(6)導航控制器NavigationController 的滑動回退功能實現