1. 程式人生 > >interactivePopGestureRecognizer無反應及假死卡頓的解決方案

interactivePopGestureRecognizer無反應及假死卡頓的解決方案

實現一個自定義按鈕是簡單的.類似這個設定controller 的navigationItem一個leftBarButtonItem.

複製程式碼
 1 - (void)viewDidLoad
 2 {
 3   self.navigationItem.leftBarButtonItem = [self backButton];
 4 }
 5 
 6 - (UIBarButtonItem *)backButton
 7 {
 8   UIImage *image = [UIImage imageNamed:@"back_button"];
 9   CGRect buttonFrame = CGRectMake(0
, 0, image.size.width, image.size.height); 10 11 UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame]; 12 [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; 13 [button setImage:[UIImage imageNamed:normalImage] forState:UIControlStateNormal];
14 15 UIBarButtonItem *item; = [[UIBarButtonItem alloc] initWithCustomView:button]; 16 17 return item; 18 }
複製程式碼

但是這樣在iOS7上 pop手勢互動就不好使了.我發現了一個輕鬆解決的辦法.

通過我的beta測試者,我收到了很多關於pop手勢的崩潰日誌.

我發現在棧中推入一個controller後,快速向左平滑,將會引起崩潰.

換句話說,如果使用者在推入還在進行的時候立即去點選返回.那麼導航控制器就秀逗了.

我在除錯日誌裡面發現這些:

nested pop animation can result in
corrupted navigation bar

經過幾個小時的奮鬥和嘗試,我發現可以緩解這個錯誤:

設定手勢的delegate為這個導航控制器

就像Stuart Hall在他的帖子說的那樣,分配了一個手勢互動行為的委託在自定義按鈕顯示的時候.然後,當用戶快速點選退出的時候,控制器因為手勢傳送了一個訊息在本身已經被銷燬的時候.

我的解決方案是簡單的讓NavigationController自己成為響應的接受者.最好用一個UINavigationController的子類.

複製程式碼
 1 @interface CBNavigationController : UINavigationController <UIGestureRecognizerDelegate>
 2 @end
 3 
 4 @implementation CBNavigationController
 5 
 6 - (void)viewDidLoad
 7 {
 8   __weak CBNavigationController *weakSelf = self;
 9 
10   if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
11   {
12     self.interactivePopGestureRecognizer.delegate = weakSelf;
13   }
14 }
15 
16 @end
複製程式碼

在轉場/過渡的時候禁用 interactivePopGestureRecognizer

當用戶在轉場的時候觸發一個後退手勢,則各種事件又湊一塊了.導航棧內又成了混亂的.我的解決辦法是,轉場效果的過程中禁用手勢識別,當新的檢視控制器載入完成後再啟用.再次建議使用UINavigationController的子類操作.

複製程式碼
 1 @interface CBNavigationController : UINavigationController <UINavigationControllerDelegate, UIGestureRecognizerDelegate>
 2 @end
 3 
 4 @implementation CBNavigationController
 5 
 6 - (void)viewDidLoad
 7 {
 8   __weak CBNavigationController *weakSelf = self;
 9 
10   if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
11   {
12     self.interactivePopGestureRecognizer.delegate = weakSelf;
13     self.delegate = weakSelf;
14   }
15 }
16 
17 // Hijack the push method to disable the gesture
18 
19 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
20 {
21   if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
22     self.interactivePopGestureRecognizer.enabled = NO;
23 
24   [super pushViewController:viewController animated:animated];
25 }
26 
27 #pragma mark UINavigationControllerDelegate
28 
29 - (void)navigationController:(UINavigationController *)navigationController
30        didShowViewController:(UIViewController *)viewController
31                     animated:(BOOL)animate
32 {
33   // Enable the gesture again once the new controller is shown
34 
35   if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
36     self.interactivePopGestureRecognizer.enabled = YES;
37 }
38 
39 
40 @end
複製程式碼

相關推薦

interactivePopGestureRecognizer反應解決方案

實現一個自定義按鈕是簡單的.類似這個設定controller 的navigationItem一個leftBarButtonItem. 1 - (void)viewDidLoad 2 { 3 self.navigationItem.leftBarButtonItem = [self backB

jQuery的Ajax同步頁面/ 解決辦法

起因: 需求是日曆中選擇不同日期,請求一次ajax,返回大量資料的時候會有頁面卡頓的錯覺,錯覺來自頁面效果一直不出現,直到資料即將完成渲染前出現一瞬間; 假死原因: 瀏覽器的渲染(UI)執行緒和js

vue 介面在蘋果手機上滑動點選事件等解決方案

用vue編寫專案接近尾聲,需要整合到移動端中,在webstorm上介面,執行效果都很完美,但是在蘋果手機上各種問題都出現了,原生專案一向滑動流暢,事件響應迅速,可是蘋果手機開啟這個專案有兩個問題,(1).滑動頁面卡頓,(2).點選事件響應緩慢,百度才發現在蘋果手機上有300ms的延遲。 一.滑動

平板以及小運存手機APP使用RecyclerView解決方案

前言 最近一直在做平板類應用的開發,關於自動售貨機的系統,我也是第一次接觸硬體以及Android盒子的開發,從剛開始的陌生到現在的熟悉,感覺還是收穫挺多的,最近專案快要上線了,介面真的很簡單,展示商品用的只是RecyclerView,也沒有巢狀,但是就是滑動卡頓

iOS進階--提高XCode編譯速度、Xcode解決方案

  提升編譯連結的速度主要有以下三個方式: 1. 提高XCode編譯時使用的執行緒數 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtas

CSS3 動畫解決方案

為什麼會卡頓? 有一個前提必須要提,前端開發者們都知道,瀏覽器是單執行緒執行的。但是我們要明確以下幾個概念:單執行緒,主執行緒和合成執行緒。 雖然說瀏覽器執行js是單執行緒執行(注意,是執行,並不是說瀏覽器只有1個執行緒,而是執行時,runing),但實際上瀏覽器的2個重要的執行執行緒,

UITableView滑動解決方案

      UITableView是一個非常常用的基本檢視,在各類app中隨處可見。對於一般佈局簡單的tableView,效能上基本上看不出來什麼問題。但是對於cell中檢視繁多的tableView,有時候可能就會出現滑動不流暢的現象,以下是本人的一些解決方案,僅供參考。

EditText 自動搜尋本地資料庫(大資料量)解決方案

假設本地存了很多資料,按關鍵字搜尋,而且要求自動搜尋,沒有搜尋按鈕,輸入法上也沒有,就要求這種體驗,當你輸入一個字元的時候,EditText的addTextChangedListener其實就開始監聽了,比如你想搜尋abc ,其實查詢了三次資料庫,先搜a,再ab,然後才是

MFC程式在電腦上雙擊執行反應缺少MSCOMM32.OCX的問題(串列埠控制元件一鍵註冊)

有時,由於我們使用了串列埠控制元件的原因,導致我們MFC生成了Release檔案依舊無法執行的問題(具體表現為雙擊EXE沒反應)這裡我們使用串列埠控制元件註冊就可以解決問題注意:請確保你的程式使用的是靜態連線方式,且出現如上所述的問題描述此方法才有效,下圖為靜態連線方式的設定

SPA程序加載首界面eclipse解決筆記

writer IT 以及 -c printf spa logs 環境 配置日誌 最近在開發SPA程序項目時遇到一個問題,因為是在開發階段,所以直接就在eclipse中啟動項目。 每次進入首界面時,eclipse就會長時間卡頓,前端界面也加載不出來,很影響開發效率。 在查找問

linux系統解決

信息 hub mar bsp 磁盤 所有 drop 緩存 lin 轉自 https://blog.csdn.net/single6/article/details/81176213 1:內存使用,可以用free -g來查 當觀察到free欄已為0的時候,表示內存

Android Stuido解決方法

修改Android studio的安裝目錄下bin/studio.vmoptions和studio64.vmoptions 兩個檔案的以下屬性就可以在記憶體配置比較大的電腦上有效減少Android Stuido卡頓現象,多開也不怎麼卡了 -Xms2048m -X

svn迴圈不能提交程式碼解決方案

1.下載sqlite3.exe ,放到.svn的同級目錄2.cmd 到.svn同目錄下,啟動cmd執行sqlite3 .svn/wc.db "select * from work_queue"3.   刪除:"qlite3 .svn/wc.db " delete from w

Android AppBarLayout + RecyclerView 下滑到第一條解決之道

網上給出的方法大致為一下四種,擇優食用 1. 自定義一個 behavior public class FlingBehavior extends AppBarLayout.Behavior { private static

SVN伺服器IP地址變更後,右鍵 解決方法(二)

體步驟如下: (建議先備份一下,原有專案檔案) 步驟一:通過Eclipse“開啟檔案”方式,快速找到當前工作空間的專案資原始檔選擇專案資原始檔,重新定向(relocate)下一步輸入新的地址重新定向成功同理操作其他專案資原始檔步驟二:找到當前工作空間下的.metadata-

ionic頁面切換解決方法

使用ionic開發app的時候,會發現切換頁面的動畫會卡頓,並不流暢,為了保證使用者體驗,大部分人會使用禁用動畫的方法$ionicConfigProvider.views.transition('no');,但並不是最好的解決思路,cordova提供了native tran

viewpager+fragment+slidingmenu滑動解決方法

這兩天在做專案的時候遇到了一個嚴重的問題,就是viewpager中的fragment新增使用slidingmenu實現側滑欄效果後出現滑動卡頓,甚至出現了"java.lang.StackOverflo

Android開發-ViewPager巢狀Fragment解決Viewpager滑動重複載入Fragment延遲載入

Fragment大家肯定不會陌生的,幾乎每個App裡都有它的存在,作為Google在3.0以後引入的一個概念,極大的解決了Activity(或者說手機螢幕)的侷限性,讓Activity碎片化,正如它的原意 【分段】,【碎片】一樣讓一個螢幕中的activity展示

ubuntu android studio "Launch Standalone SDK Manager"反應 /tools/android java not found 解決方法

環境 :ubuntu 16.04; android studio2.1.1; JDK1.8.0_91 問題描述: 1)JDK已安裝,環境變數也已配

GeForce GTX 1060玩APEX解決辦法

block 菜單 技術分享 適配 game -c ima www. 可能 APEX是最近十分火爆的免費吃雞類遊戲。由於英偉達還沒有對APEX英雄遊戲進行適配,沒有被識別出來是遊戲,所以默認使用集成顯卡,這導致APEX卡頓問題嚴重。不用說遊戲裏了,在主菜單都卡。官網寫的推薦配