右滑返回手勢(shì)和UIScrollView中手勢(shì)沖突的解決方法
項(xiàng)目中遇到一個(gè)頁(yè)面中是以一個(gè)scrollview橫向Tab展示兩個(gè)不同功能的顯示,譬如消息和公告功能,但是由于滑動(dòng)返回手勢(shì)和scrollview的滑動(dòng)返回手勢(shì)沖突了,導(dǎo)致頁(yè)面不再能夠滑動(dòng)返回。類似的還有圖片瀏覽功能也出現(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 重寫下面的方法,讓滑動(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ì)攔截了事件,那我重寫scrollView中panGestureRecognizer的代理方法,讓它不攔截就好了嘛。于是繼承UIScrollView,重寫下面的方法。
- (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),那重寫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上的,重寫上面的方法即可。然后讓橫向滾動(dòng)的scrollView繼承這個(gè)自定義UIScrollView就OK了。
原理:
scrollView的pan手勢(shì)會(huì)讓系統(tǒng)的pan手勢(shì)失效,所以我們只需要在系統(tǒng)手勢(shì)失效且scrollView的位置在初始位置的時(shí)候讓兩個(gè)手勢(shì)同時(shí)啟用就可以了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- IOS手勢(shì)操作(拖動(dòng)、捏合、旋轉(zhuǎn)、點(diǎn)按、長(zhǎng)按、輕掃、自定義)
- iOS開(kāi)發(fā)中的幾個(gè)手勢(shì)操作實(shí)例分享
- iOS實(shí)現(xiàn)手勢(shì)解鎖操作
- 使用Swift代碼實(shí)現(xiàn)iOS手勢(shì)解鎖、指紋解鎖實(shí)例詳解
- 基于JS實(shí)現(xiàn)Android,iOS一個(gè)手勢(shì)動(dòng)畫效果
- iOS仿郵箱大師的九宮格手勢(shì)密碼解鎖
- iOS開(kāi)發(fā)之觸摸事件以及手勢(shì)
- iOS輕點(diǎn)、觸摸和手勢(shì)代碼開(kāi)發(fā)
- iOS手勢(shì)密碼的實(shí)現(xiàn)方法
- iOS開(kāi)發(fā)之手勢(shì)識(shí)別
相關(guān)文章
iOS應(yīng)用內(nèi)實(shí)現(xiàn)跳轉(zhuǎn)到手機(jī)淘寶天貓的方法
這篇文章主要給大家介紹了關(guān)于iOS應(yīng)用內(nèi)如何實(shí)現(xiàn)跳轉(zhuǎn)到手機(jī)淘寶天貓的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12ios 11和iphone x的相關(guān)適配問(wèn)題及解決方法
這篇文章主要介紹了ios 11和iphone x的相關(guān)適配,文中給大家提到了在ios 11中,tableView會(huì)莫名偏移問(wèn)題的解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11HTTP/2 協(xié)議用于 iOS 推送提醒服務(wù) (APNS)
基于JSON的請(qǐng)求和響應(yīng)對(duì)于每個(gè)通知,如果成功響應(yīng),將會(huì)返回200標(biāo)識(shí) - 不用再去猜測(cè)通知是否被接收到響應(yīng)錯(cuò)誤將會(huì)以JSON字符消息的長(zhǎng)度從2048個(gè)字節(jié)增加到4096個(gè)字節(jié)連接狀態(tài)可以通過(guò)HTTP/2的ping框架來(lái)進(jìn)行檢查.2016-04-04iOS常用算法之兩個(gè)有序數(shù)組合并(要求時(shí)間復(fù)雜度為0(n))
這篇文章主要介紹了iOS常用算法之兩個(gè)有序數(shù)組合并(要求時(shí)間復(fù)雜度為0(n)),實(shí)現(xiàn)思路是先將一個(gè)數(shù)組作為合并后的數(shù)組, 然后遍歷第二個(gè)數(shù)組的每項(xiàng)元素,需要的朋友可以參考下2019-07-07iOS App中UITableView左滑出現(xiàn)刪除按鈕及其cell的重用
這篇文章主要介紹了iOS App中UITableView左滑出現(xiàn)刪除按鈕及其cell的重用的方法,實(shí)例代碼為傳統(tǒng)的Objective-C語(yǔ)言,需要的朋友可以參考下2016-03-03iOS中關(guān)于Cookie驗(yàn)證登錄狀態(tài)
這篇文章主要介紹了iOS中關(guān)于Cookie驗(yàn)證登錄狀態(tài)的相關(guān)資料,需要的朋友可以參考下2017-05-05淺析iOS中的淺拷貝和深拷貝(copy和mutableCopy)
ios提供了copy和mutablecopy方法,顧名思義,copy就是復(fù)制了一個(gè)imutable的對(duì)象,而mutablecopy就是復(fù)制了一個(gè)mutable的對(duì)象。本文給大家介紹iOS中的淺拷貝和深拷貝(copy和mutableCopy) ,感興趣的朋友一起看看吧2016-04-04