iOS7 NavigationController 手勢問題 – iPhone手機開發技術文章 iPhone軟體開發教學課程

在iOS7中,如果使用瞭UINavigationController,那麼系統自帶的附加瞭一個從屏幕左邊緣開始滑動可以實現pop的手勢。但是,如果自定義瞭navigationItem的leftBarButtonItem,那麼這個手勢就會失效。解決方法有很多種

 

1.重新設置手勢的delegate

 

 

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;

 

 

2.當然你也可以自己響應這個手勢的事件

 

[self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];

  

 

  我使用瞭第一種方案,繼承UINavigationController寫瞭一個子類,直接設置delegate到self。最初的版本我是讓這個gesture始終可以begin

 

 

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

{

return YES;

}

  

 

  但是出現很多問題,比如說在rootViewController的時候這個手勢也可以響應,導致整個程序頁面不響應;如果在push的同時我觸發這個手勢,那麼會導致navigationBar錯亂,甚至crash;push瞭多層後,快速的觸發兩次手勢,也會錯亂。嘗試瞭種種方案後我的解決方案是加個判斷,代碼如下,這次運行良好瞭。

 

@interface NavRootViewController : UINavigationController<UIGestureRecognizerDelegate,UINavigationControllerDelegate>

 

@property(nonatomic,weak) UIViewController* currentShowVC;

 

@end

  

 

 

 

@implementation NavRootViewController

 

-(id)initWithRootViewController:(UIViewController *)rootViewController

{

NavRootViewController* nvc = [super initWithRootViewController:rootViewController];

self.interactivePopGestureRecognizer.delegate = self;

nvc.delegate = self;

return nvc;

}

 

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

{

 

}

 

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated

{

if (navigationController.viewControllers.count == 1)

self.currentShowVC = Nil;

else

self.currentShowVC = viewController;

}

 

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

{

if (gestureRecognizer == self.interactivePopGestureRecognizer) {

return (self.currentShowVC == self.topViewController);

}

return YES;

}

 

@end

  

 

 

  正當竊喜的時候,發現瞭另一個更高端的解決方案,就是參考2。使用backBarButtonItem

 

 

// 統一替換 back item 的圖片

[self.navigationController.navigationBar setBackIndicatorImage:

[UIImage imageNamed:@"CustomerBackImage"]];

[self.navigationController.navigationBar setBackIndicatorTransitionMaskImage:

[UIImage imageNamed:@"CustomerBackImage"]];

 

// back item的標題 是 被將要返回的頁面 所控制的,所以如果要改變當前的back item的標題,要在上一個viewcontroller裡面設置

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]

initWithTitle:@""

style:UIBarButtonItemStylePlain

target:nil

action:nil];

  

 

  不過這種方案的缺點是如果你要設置 leftBarButtonItems 來更多的自定義左邊的 items時,手勢又會失效(或者有其他方案我還不知道*—*)。所以最後我又選擇瞭自己的方法。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。