iOS 導航欄自帶頁面右滑pop使用示例
iOS7之后蘋果導航控制器增加了一個左側(cè)邊緣右滑pop的手勢,在非棧底的控制器里面,從左邊右滑之后相當于出棧(pop)樣子。
以下設(shè)置均在自定義的UINavigationController里操作
// 默認是YES 設(shè)置為NO左側(cè)右滑手勢就不可用了 self.interactivePopGestureRecognizer.enabled = YES;
也可以通過手勢實現(xiàn)右滑
遵守UIGestureRecognizerDelegate協(xié)議,設(shè)置代理對象,實現(xiàn)一下代理方法即可:
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if (self.viewControllers.count <= 1) {
return NO;
}
return YES;
}
個人的記憶方法:
backBarButtonItem設(shè)置下一個頁面的返回按鈕
leftBarButtonItem設(shè)置當前頁面的返回按鈕
項目中我們多數(shù)會自定義左側(cè)返回按鈕leftBarButtonItem,這個時候就算設(shè)置self.interactivePopGestureRecognizer.enabled = YES了或者實現(xiàn)手勢的代理,左邊緣的右滑動手勢依舊會失效,例如如下代碼寫過之后,可以驗證一下,失效了。
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (self.viewControllers.count > 0) {
/* 不是棧底控制器的時候隱藏tabbar */
viewController.hidesBottomBarWhenPushed = YES;
// 設(shè)置左邊的返回按鈕leftBarButtonItem
UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
backBtn.frame = CGRectMake(0, 0, 44, 44);
backBtn.imageView.contentMode = UIViewContentModeCenter;
backBtn.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 34);
[backBtn setImage:[UIImage imageNamed:@"rrrr"] forState:UIControlStateNormal];
[backBtn setImage:[UIImage imageNamed:@"rrrr"] forState:UIControlStateHighlighted];
[backBtn addTarget: self action: @selector(back) forControlEvents: UIControlEventTouchUpInside];
UIBarButtonItem *backBtnItem=[[UIBarButtonItem alloc]initWithCustomView:backBtn];
viewController.navigationItem.leftBarButtonItem = backBtnItem;
// 此處改為設(shè)置backBarButtonItem 右滑手勢可以用,但自定義按鈕不展示??!
}
[super pushViewController:viewController animated:animated];
}
按照如下方式設(shè)置backBarButtonItem或leftBarButtonItem,其他不做任何設(shè)置,右滑效果可用:
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (self.viewControllers.count > 0) {
/* 不是棧底控制器的時候隱藏tabbar */
viewController.hidesBottomBarWhenPushed = YES;
}
[self.navigationBar setBackIndicatorImage:[UIImage imageNamed:@"rrrr"]];
[self.navigationBar setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"rrrr"]];
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backItem;
[super pushViewController:viewController animated:animated];
}
或者
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (self.viewControllers.count > 0) {
/* 不是棧底控制器的時候隱藏tabbar */
viewController.hidesBottomBarWhenPushed = YES;
[self.navigationBar setBackIndicatorImage:[UIImage imageNamed:@"rrrr"]];
[self.navigationBar setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"rrrr"]];
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.leftBarButtonItem = backItem;
}
[super pushViewController:viewController animated:animated];
}
進過上面的反復測試:在自定義導航欄控制器中backBarButtonItem不能用View視圖方法自定義,而leftBarButtonItem可以。
setBackIndicatorImage和setBackIndicatorTransitionMaskImage無論怎么設(shè)置都是只能看到setBackIndicatorImage的圖片,找不到原因?。?!
然后嘗試直接在root視圖控制器里面設(shè)置返回按鈕backBarButtonItem的自定義view,右滑手勢可用,但是設(shè)置leftBarButtonItem就不能使用右滑手勢:
- (void)viewDidLoad {
[super viewDidLoad];
// 設(shè)置左邊的返回按鈕
UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
backBtn.frame = CGRectMake(0, 0, 44, 44);
backBtn.imageView.contentMode = UIViewContentModeCenter;
backBtn.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 34);
[backBtn setImage:[UIImage imageNamed:@"rrrr"] forState:UIControlStateNormal];
[backBtn setImage:[UIImage imageNamed:@"rrrr"] forState:UIControlStateHighlighted];
[backBtn addTarget: self action: @selector(back) forControlEvents: UIControlEventTouchUpInside];
backBtn.backgroundColor = [UIColor redColor];
[self.navigationController.navigationBar setBackIndicatorImage:[UIImage imageNamed:@"rrrr"]];
[self.navigationController.navigationBar setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"rrrr"]];
UIBarButtonItem *backBtnItem=[[UIBarButtonItem alloc]initWithCustomView:backBtn];
backBtnItem.title = @"";
self.navigationItem.backBarButtonItem = backBtnItem;
}
以上是自己的驗證,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
一篇文章讓你看懂IOS中的block為何再也不需要WeakSelf弱引用
這篇文章主要給大家介紹了關(guān)于IOS中block為何再也不需要WeakSelf弱引用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-01-01
iOS如何去掉導航欄(UINavigationBar)下方的橫線
本篇文章主要介紹了iOS如何去掉導航欄(UINavigationBar)下方的橫線,非常具有實用價值,需要的朋友可以參考下2017-05-05
ios實現(xiàn)自動獲取label高度、寬度及最后一個位置詳解
這篇文章主要給大家介紹了關(guān)于ios如何實現(xiàn)自動獲取label高度、寬度及最后一個位置的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-10-10

