解決系統(tǒng)右滑返回手勢(shì)和UIScrollView中的手勢(shì)沖突

項(xiàng)目中遇到一個(gè)頁(yè)面中是以一個(gè)scrollview橫向Tab展示兩個(gè)不同功能的顯示檐嚣,譬如消息和公告功能啰扛,但是由于滑動(dòng)返回手勢(shì)和scrollview的滑動(dòng)返回手勢(shì)沖突了,導(dǎo)致頁(yè)面不再能夠滑動(dòng)返回鞍帝。類(lèi)似的還有圖片瀏覽功能也出現(xiàn)過(guò)煞茫。

iOS系統(tǒng)中,滑動(dòng)返回手勢(shì)蚓曼,其實(shí)是一個(gè)UIPanGestureRecognizer炸宵,系統(tǒng)默認(rèn)的操作是只有滑動(dòng)屏幕的左邊的某個(gè)位置,UIPanGestureRecognizer才會(huì)起作用捎琐。UIScrollView的滑動(dòng)手勢(shì)也是UIPanGestureRecognizer。那在側(cè)邊滑動(dòng)時(shí)瑞凑,讓UIScrollView的不響應(yīng)事件就OK了嘛,首先想到了繼承UIScrollView 重寫(xiě)下面的方法练慕,讓滑動(dòng)側(cè)邊時(shí)scrollView不響應(yīng)事件技掏,根據(jù)響應(yīng)者鏈,事件最終會(huì)傳遞給下方的滑動(dòng)手勢(shì)劲阎。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event? ? {

? ? ? if (point.x < location.x) { // location.x為系統(tǒng)的某個(gè)點(diǎn)的x

? ? ? ? ? return nil;

? ? ? } else {

? ? ? ? ? return [super hitTest:point withEvent:event];

? ? ? }

}

但是鸠真,這樣有個(gè)問(wèn)題,就是在一個(gè)頁(yè)面不同tab時(shí)锡垄,也需要滑動(dòng)切換祭隔,滑動(dòng)返回。

由于scrollView的滑動(dòng)手勢(shì)攔截了事件茴她,那我重寫(xiě)scrollView中panGestureRecognizer的代理方法程奠,讓它不攔截就好了嘛瞄沙。于是繼承UIScrollView慌核,重寫(xiě)下面的方法。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

? ? ? ? if ([self panBack:gestureRecognizer]) {

? ? ? ? ? ? return YES;

? ? ? ? }

? ? ? ? return NO;

}

- (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer {

? ? if (gestureRecognizer == self.panGestureRecognizer) {

? ? ? ? ? UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;

? ? ? ? ? CGPoint point = [pan translationInView:self];

? ? ? ? ? UIGestureRecognizerState state = gestureRecognizer.state;

? ? ? ? ? if (UIGestureRecognizerStateBegan == state || UIGestureRecognizerStatePossible == state) {

? ? ? ? ? ? ? CGPoint location = [gestureRecognizer locationInView:self];

? ? ? ? ? ? ? if (point.x > 0 && location.x < “這個(gè)自己設(shè)定" && self.contentOffset.x <= 0) {

? ? ? ? ? ? ? ? ? return YES;

? ? ? ? ? ? ? }

? ? ? ? ? }

? ? }

? ? return NO;

}

需要側(cè)邊滑動(dòng)時(shí) panBack 返回YES垫桂,這時(shí)候诬滩,我讓scrollView的手勢(shì)和頁(yè)面的滑動(dòng)返回手勢(shì)共存,scrollView不攔截手勢(shì)疼鸟,那不就可以滑動(dòng)返回了嗎。好了浩淘,測(cè)試一下吴攒,可以滑動(dòng)返回,但是滑動(dòng)返回時(shí)署惯,為什么scrollView也跟著在滑動(dòng)呢茴厉,太影響美觀了,看來(lái)還需要另外的辦法怀酷,我又回到了第一種辦法時(shí)的想法嗜闻,讓scrollView切換的時(shí)候相應(yīng)panGesture,滑動(dòng)返回的時(shí)候不響應(yīng)样眠,那重寫(xiě)scrollView中的另外一個(gè)panGestureRecognizer的代理方法翠肘。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {

? ? if ([self panBack:gestureRecognizer]) {

? ? ? ? return NO;

? ? }

? ? return YES;

}

第二種方法:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer?

{?

? ? // 首先判斷otherGestureRecognizer是不是系統(tǒng)pop手勢(shì)?

? ? if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {?

? ? ? ? // 再判斷系統(tǒng)手勢(shì)的state是began還是fail束倍,同時(shí)判斷scrollView的位置是不是正好在最左邊?

? ? ? ? if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) {?

? ? ? ? ? ? ? return YES;?

? ? ? ? }?

? ? }?

? ? return NO;?

}

以上的代碼都是在一個(gè)自定義的UIScrollView上的,重寫(xiě)上面的方法即可甥桂。然后讓橫向滾動(dòng)的scrollView繼承這個(gè)自定義UIScrollView就OK了邮旷。

原理:

scrollView的pan手勢(shì)會(huì)讓系統(tǒng)的pan手勢(shì)失效,所以我們只需要在系統(tǒng)手勢(shì)失效且scrollView的位置在初始位置的時(shí)候讓兩個(gè)手勢(shì)同時(shí)啟用就可以了办陷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜂嗽,隨后出現(xiàn)的幾起案子殃恒,更是在濱河造成了極大的恐慌,老刑警劉巖病附,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亥鬓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡覆积,警方通過(guò)查閱死者的電腦和手機(jī)熟呛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)庵朝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人椎瘟,你說(shuō)我怎么就攤上這事》挝担” “怎么了儡羔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵笔链,是天一觀的道長(zhǎng)鉴扫。 經(jīng)常有香客問(wèn)我澈缺,道長(zhǎng)炕婶,這世上最難降的妖魔是什么莱预? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任依沮,我火速辦了婚禮,結(jié)果婚禮上宋渔,老公的妹妹穿的比我還像新娘。我一直安慰自己皇拣,他們只是感情好薄嫡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布毫深。 她就那樣靜靜地躺著,像睡著了一般钾恢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘩蚪,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天疹瘦,我揣著相機(jī)與錄音巡球,去河邊找鬼。 笑死酣栈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的起便。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妙痹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怯伊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起耿芹,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤猩系,失蹤者是張志新(化名)和其女友劉穎中燥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體疗涉,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咱扣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年闹伪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偏瓤。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厅克,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出证舟,到底是詐尸還是另有隱情,我是刑警寧澤漆枚,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布抵知,位于F島的核電站昔榴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吱肌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纺蛆。 院中可真熱鬧规揪,春花似錦、人聲如沸猛铅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栗菜。三九已至,卻和暖如春疙筹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背而咆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桂塞,地道東北人馍驯。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓汰瘫,卻偏偏與公主長(zhǎng)得像狂打,于是被迫代替她去往敵國(guó)和親趴乡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子对省,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容