看了滑動(dòng)返回的代碼,總覺得沒有完全理解路鹰,雖然可以囫圇吞棗照搬使用凤薛,但又覺得不妥座泳,看了別人的解釋又大體相似呀邢,歸根到底是由于其中有一些細(xì)節(jié)之處沒有搞清楚洒沦,深思之后,把自己的理解及時(shí)寫下來价淌,以備翻看
首先明確滑動(dòng)返回功能:是由導(dǎo)航控制器的交互性彈出手勢識(shí)別器:self.interactivePopGestureRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:_UINavigationInteractiveTransition的對(duì)象? action:@selector(handleNavigationTransition:)在初始化創(chuàng)建的時(shí)候指定了--系統(tǒng)私有對(duì)象--響應(yīng)拖動(dòng)手勢事件--去執(zhí)行處理導(dǎo)航切換這個(gè)方法handleNavigationTransition
如何確定是這樣創(chuàng)建的呢申眼?
打印self.interactivePopGestureRecognizer,進(jìn)行內(nèi)部實(shí)現(xiàn)模擬
問題1:既然這個(gè)手勢識(shí)別器對(duì)象存在蝉衣,系統(tǒng)的私有對(duì)象和方法這個(gè)不用擔(dān)心括尸,必然存在,可是為什么還是無效呢病毡?
猜測:可能有一個(gè)方法控制拖動(dòng)事件沒有響應(yīng)濒翻,注意上方用--隔開的滿足條件
思路:按照以往的規(guī)律,target和delegate都可以響應(yīng)外部事件啦膜,那么這個(gè)手勢識(shí)別器是否還設(shè)置了delegate有送?,打印后確實(shí)如此僧家,那么可以肯定它的代理對(duì)象執(zhí)行了某個(gè)代理方法去控制判斷:如果是自定義了返回按鈕雀摘,那么這個(gè)手勢識(shí)別器就不接收UITouch這個(gè)拖動(dòng)手勢對(duì)象,或者說不接收拖動(dòng)事件八拱,這個(gè)方法類似于一個(gè)開關(guān)阵赠,方法內(nèi)部進(jìn)行了判斷涯塔,大概是這樣:if(self.navigationItem.leftBarButtonItem) ?return NO;
注意:手勢識(shí)別器即UIPanGestureRecognizer不是手勢,它是管理手勢的類清蚀,UITouch才是手勢
測試:如果不執(zhí)行這個(gè)代理方法匕荸,這個(gè)判斷就無效了,這個(gè)開關(guān)也就不起作用了枷邪,那么最直接的做法是:self.self.interactivePopGestureRecognizer.delegate = nil每聪;這樣handleNavigationTransition這個(gè)方法又可以默認(rèn)執(zhí)行了
問題2: ?設(shè)置代理為nil后,在根控制器下齿风,滑動(dòng)返回药薯,處于假死狀態(tài),這又是什么原因?qū)е碌模?/p>
原因:根控制器下救斑,依然可以默認(rèn)響應(yīng)滑動(dòng)返回上級(jí)事件童本,這顯然是不合理的,系統(tǒng)處于內(nèi)部保護(hù)脸候,終止了這種做法
區(qū)別:默認(rèn)返回按鈕穷娱,在根控制器下,為什么不會(huì)假死运沦?
思路:那個(gè)代理方法既然起開關(guān)作用泵额,決定什么情況下響應(yīng),那么它還應(yīng)該做了一個(gè)判斷條件携添,就是根控制器下不起作用嫁盲,非根控制器才起作用,而剛才已經(jīng)為nil烈掠,但又不能用系統(tǒng)提供的代理羞秤,只能自己重寫這個(gè)方法,進(jìn)行手動(dòng)控制
解決:如果導(dǎo)航控制器中要實(shí)現(xiàn)代理方法左敌,那么需要設(shè)置代理為當(dāng)前導(dǎo)航控制器對(duì)象瘾蛋,遵守代理協(xié)議<UIGestureRecognizerDelegate>
1.self.self.interactivePopGestureRecognizer.delegate = self
2.-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer ?shouldReceiveTouch:(UITouch *)touch
{
return ?self.childViewControllers.count > 1;
}
總結(jié):1. self.interactivePopGestureRecognizer既可以使用target,又可以使用delegate矫限,但是指定的對(duì)象實(shí)現(xiàn)的方法功能不一樣哺哼,一個(gè)是進(jìn)行返回切換,一個(gè)是控制什么時(shí)候才可以切換叼风,這個(gè)類的使用還真是特別取董,讓人耳目一新,原來還可以這樣搞
2. 上面的代理方法咬扇,系統(tǒng)默認(rèn)進(jìn)行了兩個(gè)判斷甲葬,一個(gè)是是否設(shè)置了leftBarButtonItem ,另一個(gè)是是否是根控制器,如果都為是懈贺,那么控制切換不執(zhí)行
感悟:學(xué)習(xí)后的思考總是一個(gè)煎熬的過程经窖,耗時(shí)又耗力坡垫,但又心知欲速則不達(dá),沒有理解清楚的地方画侣,埋下的坑冰悠,又會(huì)產(chǎn)生一個(gè)心理負(fù)擔(dān),過后還會(huì)偶然想起配乱,但又不通透溉卓,索性花點(diǎn)時(shí)間總結(jié)一下
路過的大俠,還望指出不足之處搬泥!