關(guān)于UIScrollView和UITableView手勢(shì)沖突的解決方法

原文 : 與佳期的個(gè)人博客(gonghonglou.com)

前段時(shí)間公司項(xiàng)目中遇到的問題吵聪,解決之后想著寫篇博客總結(jié)一下但苦于一直沒有時(shí)間劲装,以致拖到了現(xiàn)在胧沫,馬上過年了現(xiàn)在來還賬昌简。。绒怨。

項(xiàng)目中需要實(shí)現(xiàn)以下這種頁面纯赎,需求:

1、在 UIScrollView 上嵌套左右兩個(gè) UITableView南蹂,以實(shí)現(xiàn)左右滑動(dòng)展示頁面的效果

2犬金、UITableView 可執(zhí)行左滑刪除 cell 功能

需求示意圖

然而在實(shí)現(xiàn)過程中發(fā)現(xiàn) UIScrollView 的滾動(dòng)和 UITableView 的左滑刪除存在手勢(shì)沖突,幸好解決方法并不復(fù)雜六剥,不過在實(shí)現(xiàn)過程中還是很捉急的晚顷。

階段一:實(shí)現(xiàn) UITableView 左右滑動(dòng)的效果

這個(gè)效果的實(shí)現(xiàn)還是很簡單的,代碼如下:


CGFloat viewWidth = self.view.frame.size.width;

CGFloat viewHeight = self.view.frame.size.height;

// scroll view

self.scrollView = [[MyScrollView alloc] initWithFrame:self.view.frame];

self.scrollView.showsHorizontalScrollIndicator = NO;

self.scrollView.bounces = NO;

self.scrollView.pagingEnabled = YES;

self.scrollView.contentSize = CGSizeMake(viewWidth * 2, 0);

[self.view addSubview:self.scrollView];

// left table view

self.leftTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, viewWidth, viewHeight-160) style:UITableViewStylePlain];

self.leftTableView.backgroundColor = [UIColor whiteColor];

[self.scrollView addSubview:self.leftTableView];

// right table view

self.rightTableView = [[UITableView alloc] initWithFrame:CGRectMake(viewWidth, 0, viewWidth, viewHeight-160) style:UITableViewStylePlain];

[self.scrollView addSubview:self.rightTableView];

這個(gè)階段可能遇到的情況也許是疗疟,如果當(dāng)前頁面是被前一個(gè)頁面通過 navigationController push 出來的話该默,實(shí)現(xiàn)這種效果后可能會(huì)導(dǎo)致邊緣觸發(fā)返回手勢(shì)實(shí)效,如果該手勢(shì)失效應(yīng)該檢查:

1策彤、系統(tǒng)邊緣觸發(fā)返回手勢(shì)是否開啟


self.navigationController.interactivePopGestureRecognizer.enabled = YES;

2栓袖、在該頁面是否自定義了導(dǎo)航條的返回按鈕

如果自定義了導(dǎo)航條的返回按鈕,系統(tǒng)自帶的邊緣觸發(fā)返回手勢(shì)將會(huì)實(shí)效店诗,解決方法是設(shè)置代理 UIGestureRecognizerDelegate裹刮,并設(shè)置:


self.navigationController.interactivePopGestureRecognizer.delegate = self;

然后重載其代理方法:


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

 // 導(dǎo)航的 rootViewController 關(guān)閉右滑返回功能

 if (self.navigationController.viewControllers.count <= 1) {

 return NO;

 }

 return YES;

}

階段二:實(shí)現(xiàn) UITableView 左滑刪除功能

這一階段還是比較坑的

在實(shí)現(xiàn)了 editActionsForRowAtIndexPath: 代理方法之后發(fā)現(xiàn)并沒有出現(xiàn)左滑刪除功能,因?yàn)樵撌謩?shì)被 UIScrollView 攔截了庞瘸,只有快速左滑時(shí)才有可能出現(xiàn)左滑刪除按鈕必指,但這明顯不符合操作習(xí)慣

然后發(fā)現(xiàn)將 scrollViewscrollEnabled 屬性設(shè)置為 NO 時(shí),便出現(xiàn)了左滑刪除按鈕恕洲,即:


self.scrollView.scrollEnabled = NO;

最初想到的解決方案是:

1、通過 touchesBegan:梅割、touchesMoved: 等方法判斷觸摸點(diǎn)出現(xiàn)的位置

2霜第、如果斷觸摸點(diǎn)出現(xiàn)在 UITableView 區(qū)域,則設(shè)置 scrollView.scrollEnabled = NO;户辞,否則設(shè)置 scrollView.scrollEnabled = YES;

然而實(shí)際操作之后發(fā)現(xiàn)泌类,根本不會(huì)調(diào)用 touchesBegan:touchesMoved: 等方法底燎,看來 UIScrollView 將這些方法也攔截了刃榨。

卒!

而且后來也發(fā)現(xiàn)即使這個(gè)方法生效也并不合理双仍,因?yàn)閷?duì)于左邊的 UITableView 來說枢希,當(dāng)數(shù)據(jù)源過少,cell 并不能填滿 UITableView 區(qū)域時(shí)朱沃,下半部份空白的 UITableView 區(qū)域并不能觸發(fā) UIScrollView 的滾動(dòng)苞轿,因?yàn)槲覀儾⒉恢?UITableView 區(qū)域是否被填滿茅诱。

而我們期望的最優(yōu)秀的表現(xiàn)應(yīng)該是當(dāng)對(duì)左邊的 UITableView 執(zhí)行左滑手勢(shì)時(shí):

1、如果 觸摸點(diǎn)所在區(qū)域存在 cell 時(shí)搬卒,觸發(fā)左滑刪除功能

2瑟俭、否則 觸發(fā) UIScrollView 的滾動(dòng)

(當(dāng)然可以根據(jù)數(shù)據(jù)源計(jì)算 cell 高度來判斷,但這樣就依賴了數(shù)據(jù)源并且這種根據(jù)數(shù)據(jù)計(jì)算控件高度來做判斷的方法也太蠢了契邀。摆寄。。)

所以最終的解決方案是自己實(shí)現(xiàn)一個(gè) MyScrollView 繼承自 UIScrollView坯门,并重載 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 代理方法:


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

 if (gestureRecognizer.state != 0) {

 return YES;

 } else {

 return NO;

 }

}

這樣微饥,當(dāng) ScrollView 識(shí)別到左滑手勢(shì)時(shí)仍然能向下傳遞該手勢(shì)給它的子視圖,手勢(shì)識(shí)別的流程應(yīng)當(dāng)是:

1田盈、ScrollView 識(shí)別到左滑手勢(shì)畜号,觸發(fā)滾動(dòng)功能的同時(shí)將該手勢(shì)傳遞給它的子視圖 UITableView

2、UITableView 傳遞該手勢(shì)給它的子視圖 UITableViewCell

3允瞧、如果存在子視圖 UITableViewCell 則觸發(fā)左滑刪除功能

目前為止简软,已經(jīng)可以實(shí)現(xiàn)在 UIScrollView 上嵌套左右兩個(gè) UITableView 左右滑動(dòng)的功能,并且 UITableView 存在左滑刪除功能述暂,但執(zhí)行左滑刪除時(shí) UIScrollView 仍在滾動(dòng)痹升,顯然不合理,幸好畦韭,UIScrollView 給我們提供了如下兩個(gè)方法疼蛾,我們可以在左滑刪除手勢(shì)的開始和完成的時(shí)機(jī)設(shè)置 scrollView.scrollEnabled


- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath {

 self.scrollView.scrollEnabled = NO;

}

- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(nullable NSIndexPath *)indexPath {

 self.scrollView.scrollEnabled = YES;

}

即 當(dāng)左滑刪除開始時(shí)禁止 UIScrollView 滾動(dòng),當(dāng)左滑刪除完成時(shí)開啟 UIScrollView 的滾動(dòng)艺配。

至此便解決了 UIScrollView 左右滾動(dòng)和 UITableView 左滑刪除手勢(shì)沖突的問題察郁。

ScrollViewDemo GitHub 地址

后記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赠法,一起剝皮案震驚了整個(gè)濱河市麦轰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌砖织,老刑警劉巖款侵,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侧纯,居然都是意外死亡新锈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門茂蚓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壕鹉,“玉大人剃幌,你說我怎么就攤上這事×涝。” “怎么了负乡?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脊凰。 經(jīng)常有香客問我抖棘,道長,這世上最難降的妖魔是什么狸涌? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任切省,我火速辦了婚禮,結(jié)果婚禮上帕胆,老公的妹妹穿的比我還像新娘朝捆。我一直安慰自己,他們只是感情好懒豹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布芙盘。 她就那樣靜靜地躺著,像睡著了一般脸秽。 火紅的嫁衣襯著肌膚如雪儒老。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天记餐,我揣著相機(jī)與錄音驮樊,去河邊找鬼。 笑死片酝,一個(gè)胖子當(dāng)著我的面吹牛囚衔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雕沿,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼佳魔,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了晦炊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤宁脊,失蹤者是張志新(化名)和其女友劉穎断国,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榆苞,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菠红,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年卫旱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片混驰。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖耕蝉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤砰碴,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站板丽,受9級(jí)特大地震影響呈枉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜埃碱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一猖辫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砚殿,春花似錦啃憎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至名党,卻和暖如春叹阔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背传睹。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國打工耳幢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欧啤。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓睛藻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親邢隧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子店印,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件倒慧、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,095評(píng)論 4 62
  • 從《Qt實(shí)戰(zhàn)一二三》這里面按摘,我們可以找到很詳細(xì)的有關(guān)Qt環(huán)境與開發(fā)工具的帖子,所以我也就不想再重復(fù)寫了纫谅,而且我也沒...
    ibucoin閱讀 1,016評(píng)論 0 2
  • 拍今天早餐的時(shí)候炫贤,小一萬說紅色碗放上去太難看。 她說付秕,這會(huì)影響創(chuàng)作者的整體美袄颊洹! 媽呀询吴,還整體美亮元! 不都是一樣生活...
    007寫了自己的生活閱讀 534評(píng)論 5 5