貓貓學iOS 之微博項目實戰(6)導航控制器NavigationController 的滑動回退功能實現

來源:互聯網
上載者:User

標籤: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 的滑動回退功能實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.