現(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