動態計算UITableViewCell高度詳解

在iOS7之前的系統,如果要自定義返回按鈕,直接設置backBarButtonItem是不行的,有兩種方式,一種是用leftBarButtonItem替代;一種是:

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. UIImage *backButtonImage = [[UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];  
  2. [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];  
  3. [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];  

但第二種方法只能自定義返回按鈕的背景和文字,如果要自定義上面的圖標則不行。所以使用leftBarButtonItem是最佳方式。

但是在iOS7系統中,自帶了可以通過右滑返回上一級頁面的手勢,如果僅僅修改leftBarButtonItem是無法響應這個手勢的。可以在pushViewController之後加入如下代碼:

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. [_currentNav pushViewController:viewController animated:YES];  
  2. //開啓iOS7的滑動返回效果  
  3. if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
  4.     _currentNav.interactivePopGestureRecognizer.delegate = nil;  
  5. }  

這樣即可完美解決iOS7上無法滑動的問題。

當然網上還有一種解決方法是在設置leftBarButtonItem之後加上:

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. self.navigationItem.backBarButtonItem = backButton;  
  2. self.navigationController.interactivePopGestureRecognizer.delegate = self;  

但這兩行代碼必須放在viewWillAppear中,相比上一種方式要修改的代碼更多,因此建議使用上一種方式。

響應了iOS7的滑動返回手勢之後,我們還會發現一個問題,iOS7的滑動返回不會調用我們給leftBarButtonItem設置的回調,那麼返回的事件如何捕捉呢?可以通過以下代碼:

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. - (void)viewWillDisappear: (BOOL)animated  
  2. {  
  3.     [super viewWillDisappear: animated];  
  4.     if (![[self.navigationController viewControllers] containsObject: self])  
  5.     {  
  6.         // the view has been removed from the navigation stack, back is probably the cause  
  7.         // this will be slow with a large stack however.  
  8.     }  
  9. }  

至此,我們就完美解決了iOS7上使用leftBarButtonItem的滑動返回問題。

有朋友提出以上方式在多次滑動之後會導致界面假死,這裏再給出一種解決方案:

在所有除一級頁面之外的頁面的viewDidAppear和viewWillDisappear中加入以下代碼:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. - (void)viewWillDisappear:(BOOL)animated {  
  2.     [super viewWillDisappear:animated];  
  3.     //代理置空,否則會閃退  
  4.     if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
  5.         self.navigationController.interactivePopGestureRecognizer.delegate = nil;  
  6.     }  
  7. }  

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. - (void)viewDidAppear:(BOOL)animated {  
  2.     [super viewDidAppear:animated];  
  3.     //開啓iOS7的滑動返回效果  
  4.     if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
  5.         //只有在二級頁面生效  
  6.         if ([self.navigationController.viewControllers count] == 2) {  
  7.             self.navigationController.interactivePopGestureRecognizer.delegate = self;  
  8.         }  
  9.     }  
  10. }  

在uinavigationcontroller的delegate中實現以下方法:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {  
  2.     //開啓滑動手勢  
  3.     if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
  4.         navigationController.interactivePopGestureRecognizer.enabled = YES;  
  5.     }  
  6. }  

在pushviewcontroller之前加入以下代碼:

[objc] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. //在切換界面的過程中禁止滑動手勢,避免界面卡死  
  2. if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {  
  3.    _currentNav.interactivePopGestureRecognizer.enabled = NO;  
  4. }  
  5. [_currentNav pushViewController:viewController animated:YES];  

即可在實現滑動返回的同時,避免界面卡死的問題。


如果大家覺得對自己有幫助的話,還希望能幫頂一下,謝謝:)
轉載請註明出處,謝謝!
發佈了0 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章