這是scrollView左右滑動(dòng)與側(cè)滑手勢(shì)沖突解決方法。
在寶雞等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營(yíng)銷(xiāo)推廣,外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè),寶雞網(wǎng)站建設(shè)費(fèi)用合理。
其實(shí)就是判斷手勢(shì)是否繼續(xù)向下傳遞。
1.當(dāng)然要自定義一個(gè)UIScrollView,在CustomScrollView的手勢(shì)代理方法里實(shí)現(xiàn)自己的邏輯
之前寫(xiě)過(guò)類(lèi)似的( ),這里就當(dāng)溫故而知新吧!
一個(gè)tableView上的某個(gè)cell(后面用cellA代替)上有一個(gè)scrollView,該scrollView上添加了幾個(gè)tableView。要求在cellA所在的section的sectionHeader滑動(dòng)到頂部的時(shí)候cellA上的scrollView上的幾個(gè)tableView可以滑動(dòng),否則不能滑動(dòng)。
1.需要底部的tableView能夠同時(shí)響應(yīng)多個(gè)手勢(shì)(這樣在滑動(dòng)子tableView時(shí)候,底部的tableView也能滑動(dòng))
2.在最開(kāi)始的時(shí)候底部tableView能夠滑動(dòng),scrollView上的tableView不能滑動(dòng)。
3.當(dāng)cellA所在的section的sectionHeader滑動(dòng)到頂部的時(shí)候,scrollView上的幾個(gè)tableView可以滑動(dòng)。
4.當(dāng)scrollView上的tableView在Y方向的偏移量為0的時(shí)候,scrollView上tableView不能滑動(dòng),底部的tableView能滑動(dòng)。
1.監(jiān)聽(tīng)底部tableView的偏移量,從而設(shè)置該tableView以及scrollView上幾個(gè)tableView是否能滑動(dòng)
2.設(shè)置scrollView上幾個(gè)tableView是否能滑動(dòng)
3.監(jiān)聽(tīng)scrollView上幾個(gè)tableView的偏移量,從而通知底部tableView是否可滑動(dòng)
4.接收通知,從而設(shè)置底部tableView以及scrollView上幾個(gè)tableView是否能滑動(dòng)
我們點(diǎn)擊UIButton,發(fā)現(xiàn)只響應(yīng)了button的點(diǎn)擊事件
如何使得UIButton的點(diǎn)擊事件和view的手勢(shì)事件同時(shí)響應(yīng)呢
可以設(shè)置tap的cancelsTouchesInView為NO,這樣Button的點(diǎn)擊事件和View的手勢(shì)事件都會(huì)響應(yīng)
// default is YES. causes touchesCancelled:withEvent: or pressesCancelled:withEvent: to be sent to the view for all touches or presses recognized as part of this gesture immediately before the action method is called.
點(diǎn)擊UICollectionView的cell,發(fā)現(xiàn)cell沒(méi)有被響應(yīng),響應(yīng)的是tap手勢(shì)事件
如果想要點(diǎn)擊響應(yīng)的是 cell 的點(diǎn)擊事件,而不是 view 的 tap 手勢(shì),該如何實(shí)現(xiàn)呢
實(shí)現(xiàn)gestureRecognizer:shouldReceiveTouch:代理
兩個(gè)view上都加了點(diǎn)擊手勢(shì),如果想兩個(gè)手勢(shì)都響應(yīng)
項(xiàng)目中常遇到一種場(chǎng)景,UIScrollView上增加了一個(gè)UIScrollView的子視圖,當(dāng)某些條件下需要父視圖滑動(dòng),某些情況下需要子視圖滑動(dòng)
例如一個(gè)UICollectionView嵌套了一個(gè)UICollectionView,希望嵌套的UICollectionView在父視圖達(dá)到一定高度時(shí),父視圖不再滾動(dòng),而是子視圖滾動(dòng)
CustomCell內(nèi)也有一個(gè)collectionView(CustomCollectionView 類(lèi))
CustomCollectionView設(shè)置一個(gè)屬性customScrollEnable,用來(lái)控制當(dāng)與其他手勢(shì)沖突時(shí)的優(yōu)先級(jí)
在父視圖的scrollViewDidScroll
子視圖的scrollViewDidScroll里
這樣就可以通過(guò)兩個(gè)很簡(jiǎn)單的判斷設(shè)置customScrollEnable屬性控制滑動(dòng)手勢(shì)的優(yōu)先級(jí)
補(bǔ)充手勢(shì)代理
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
手勢(shì)識(shí)別器是否能夠開(kāi)始識(shí)別手勢(shì).
當(dāng)手勢(shì)識(shí)別器識(shí)別到手勢(shì),準(zhǔn)備從UIGestureRecognizerStatePossible狀態(tài)開(kāi)始轉(zhuǎn)換時(shí).調(diào)用此代理,如果返回YES,那么就繼續(xù)識(shí)別,如果返回NO,那么手勢(shì)識(shí)別器將會(huì)將狀態(tài)置為UIGestureRecognizerStateFailed.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
gestureRecognizer : 此對(duì)象發(fā)送的代理消息.
返回YES允許gestureRecognizer與otherGestureRecognizer同時(shí)識(shí)別.
如果返回NO,分兩種情況.1.兩個(gè)手勢(shì)都返回NO,那么不會(huì)同時(shí)識(shí)別.如果一個(gè)NO,一個(gè)YES.可能會(huì)同時(shí)識(shí)別.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);
一般用來(lái)重寫(xiě)該方法.來(lái)定義什么時(shí)候手勢(shì)識(shí)別失敗.如果直接返回YES,那么gestureRecognizer與otherGestureRecognizer互斥的話gestureRecognizer識(shí)別失敗. 可以用tap手勢(shì)和longPress手勢(shì)試試.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);
和3差不多,注意這個(gè)Be,所以是相反的,如果互斥,otherGestureRecognizer識(shí)別失敗.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
返回手勢(shì)識(shí)別器是否允許檢查手勢(shì)對(duì)象.
UIKit將會(huì)在touchesBegan:withEvent:方法之前調(diào)用這個(gè)代理.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press;
返回手勢(shì)識(shí)別器是否允許檢查按壓(UIPress對(duì)象).
UIKit將會(huì)在touchesBegan:withEvent:方法之前調(diào)用這個(gè)代理.
我們可以通過(guò)配置手勢(shì)的屬性來(lái)改變它的表現(xiàn),下面介紹三個(gè)常用的屬性:
cancelsTouchesInView:該屬性默認(rèn)是 true。顧名思義,如果設(shè)置成 false,當(dāng)手勢(shì)識(shí)別成功時(shí),將不會(huì)發(fā)送 touchesCancelled 給目標(biāo)視圖,從而也不會(huì)打斷視圖本身方法的觸發(fā),最后的結(jié)果是手勢(shì)和本身方法同時(shí)觸發(fā)。有的時(shí)候我們不希望手勢(shì)覆蓋掉視圖本身的方法,就可以更改這個(gè)屬性來(lái)達(dá)到效果。
delaysTouchesBegan:該屬性默認(rèn)是 false。在上個(gè)例子中我們得知,在手指觸摸屏幕之后,手勢(shì)處于 .possible 狀態(tài)時(shí),視圖的 touches 方法已經(jīng)開(kāi)始觸發(fā)了,當(dāng)手勢(shì)識(shí)別成功之后,才會(huì)取消視圖的 touches 方法。當(dāng)該屬性時(shí) true 時(shí),視圖的 touches 方法會(huì)被延遲到手勢(shì)識(shí)別成功或者失敗之后才開(kāi)始。也就是說(shuō),假如設(shè)置該屬性為 true ,在整個(gè)過(guò)程中識(shí)別手勢(shì)又是成功的話,視圖的 touches 系列方法將不會(huì)被觸發(fā)。
delaysTouchesEnded:該屬性默認(rèn)是 true。與上個(gè)屬性類(lèi)似,該屬性為 true 時(shí),視圖的 touchesEnded 將會(huì)延遲大約 0.15s 觸發(fā)。該屬性常用于連擊,比如我們需要觸發(fā)一個(gè)雙擊手勢(shì),當(dāng)我們手指離開(kāi)屏幕時(shí)應(yīng)當(dāng)觸發(fā) touchesEnded,如果這時(shí)該屬性為 false,那就不會(huì)延遲視圖的 touchesEnded 方法,將會(huì)立馬觸發(fā) ,那我們的雙擊就會(huì)被識(shí)別為兩次單擊。當(dāng)該屬性是 true 時(shí),會(huì)延遲 touchesEnded 的觸發(fā),將兩次單擊連在一起,來(lái)正常識(shí)別這種雙擊手勢(shì)。
1. 遵守代理協(xié)議? UIGestureRecognizerDelegate
2. 給手勢(shì)設(shè)置代理
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(respondsToTapGesture:)];
tap.delegate = self;
[self.view addGestureRecognizer:tap];
3.實(shí)現(xiàn)代理方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// 點(diǎn)擊的view的類(lèi)名
NSLog(@"%@", NSStringFromClass([touch.view class]));
// 點(diǎn)擊了tableViewCell,view的類(lèi)名為UITableViewCellContentView,則不接收Touch點(diǎn)擊事件
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}
return? YES;
}
想要的效果 :既觸發(fā)didSelectItemAtIndexPath方法,又能在CollectionView自身上處理TapGesture
問(wèn)題 : collectionView沒(méi)有內(nèi)容視圖, 不能像上面那樣解決沖突
解決方法 :
1. 遵守代理協(xié)議 ? ?UIGestureRecognizerDelegate
2. 給手勢(shì)設(shè)置代理
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cancelDelete)];
apGestureRecognizer.delegate = self;? [注意點(diǎn)]
[self.collectionview addGestureRecognizer:tapGestureRecognizer];
3. self要實(shí)現(xiàn)UIGestureRecognizerDelegate協(xié)議,其中就有g(shù)estureRecognizer:shouldReceiveTouch:方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if (touch.view != self.collectionView) {
return NO;
}else {
return YES;
}
}
1、在tableView上添加手勢(shì),并設(shè)置手勢(shì)代理為當(dāng)前控制器
2、利用代理方法- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 允許tableView上響應(yīng)多手勢(shì)
3、利用代理方法- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer,控制添加的手勢(shì)是否響應(yīng)
通常在tableView上添加手勢(shì),會(huì)有沖突,比如在tableView上添加pan手勢(shì),就會(huì)讓tableView的無(wú)法滾動(dòng),在tableViewCell上添加tap手勢(shì),就會(huì)讓tableViewCell的didSelectCell方法無(wú)法響應(yīng)等等,利用代理方法 gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: 雖然能讓添加的手勢(shì)和原來(lái)的事件都響應(yīng),但是會(huì)造成一次性響應(yīng)多個(gè)事件,這時(shí)候就需要用代理方法gestureRecognizerShouldBegin:來(lái)控制,添加的手勢(shì)是否需要響應(yīng),并且不會(huì)阻斷事件傳遞,這樣就能很好的解決沖突問(wèn)題。