一個(gè)view兩個(gè)手勢(shì)

現(xiàn)在有一個(gè)Aview,和一個(gè)子視圖的子視圖bview;兩個(gè)不同事件的長按手勢(shì)AG,bG。長按A區(qū)域需要響應(yīng)AG,但是按到了b區(qū)域的時(shí)候,需要響應(yīng)bG。發(fā)現(xiàn)網(wǎng)上很多資料都不是這個(gè)情況,所以你會(huì)怎么做?

1、如何定義

處理肯定是要在手勢(shì)代理里去處理的。一般同一個(gè)view上的手勢(shì)沖突都在這個(gè)代理里處理,多次調(diào)用。

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

但是如何定義呢?一開始我這樣定義兩個(gè)手勢(shì)

UILongPressGestureRecognizer *homeLong = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(homeLongGes)];
homeLong.delegate = self;
[self.view addGestureRecognizer:homeLong];

UILongPressGestureRecognizer *timeLong = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(timeLongGes)];
timeLong.delegate = self;
[_countDown.titleLabel addGestureRecognizer:timeLong];

在同一個(gè)控制器中,代理只會(huì)走一次。然后我換成了
第二次定義兩個(gè)手勢(shì)

UILongPressGestureRecognizer *homeLong = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(homeLongGes)];
homeLong.delegate = self;
[self.view addGestureRecognizer:homeLong];

UILongPressGestureRecognizer *timeLong = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(timeLongGes)];
timeLong.delegate = self;
[self.view addGestureRecognizer:timeLong];

此時(shí)代理調(diào)用兩次了,說明要開始判斷兩個(gè)手勢(shì)了。

2、代理處理

首先要說的一點(diǎn)是,假如代理里直接return YES,那么最后的手勢(shì)會(huì)進(jìn)行響應(yīng),最先定義的不會(huì)響應(yīng),假如NO,則都不響應(yīng)。
這樣則說明點(diǎn)到b區(qū)域,又是b手勢(shì)的時(shí)候 return yes,否則返回no。
既然位置不同,很正常的第一個(gè)想到的是:肯定需要判斷點(diǎn)擊位置來處理。那么代理中這樣處理

   if (CGRectContainsPoint(_countDown.timeLabel.frame,[gestureRecognizer locationInView:_countDown])) { 
      return YES;
   }
   else if (!CGRectContainsPoint(_countDown.frame,[gestureRecognizer locationInView:self.view])) {
       return YES;
   }
   return NO;

乍看是沒問題,其實(shí)這樣寫,每次都返回YES,就跟之前的情況一樣了。
所以我們還得加個(gè)判斷,就是在這個(gè)區(qū)域中,還得是這個(gè)區(qū)域的這個(gè)手勢(shì)。
那你可能會(huì)想到給手勢(shì)一個(gè)標(biāo)示,tag,但是手勢(shì)不是繼承view,所以給不了tag。看了UIGestureRecognizer的API,有個(gè)view,可以給手勢(shì)的view加tag,但是我們又是同一個(gè)view,所以手勢(shì)也區(qū)別不了,那怎么辦?

在這里我想了很久。。當(dāng)時(shí)還沒想到,還是過幾天突然想到的。。就是我想手勢(shì)分配的內(nèi)存地址肯定不一樣,我用內(nèi)存地址不就可以嗎,又突然想到,內(nèi)存地址的話,我把兩個(gè)成員變量定義成兩個(gè)局部變量來用不就可以了嗎。然后我修改了代碼。

   if (CGRectContainsPoint(_countDown.timeLabel.frame,[gestureRecognizer locationInView:_countDown]) && gestureRecognizer == _timeTap) {
       return YES;
   }
   else if (!CGRectContainsPoint(_countDown.frame,[gestureRecognizer locationInView:self.view]) && gestureRecognizer == _homeTap) {
            
       return YES;
   }
        
   return NO;

需要注意的是:上述代理中第一個(gè)if,是根據(jù)你手勢(shì)在b父視圖位置的與b視圖大小是否包含來判斷的。
這樣就成功了,假如你的手勢(shì)事件還需要一些復(fù)雜的操作,你可以再加一些標(biāo)示來判斷代理是否需要返回 NO。


_本站文章為 寶寶巴士 SD.Team 原創(chuàng),轉(zhuǎn)載務(wù)必在明顯處注明:(作者官方網(wǎng)站: 寶寶巴士 ) __轉(zhuǎn)載自【寶寶巴士SuperDo團(tuán)隊(duì)】原文鏈接: http://www.itdecent.cn/p/db4247c1934a

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容