UIScrollView默認(rèn)手勢(shì)有:PagingSwipeGestureRecognizer、DelayedTouchesBeganGestureRecognizer、PanGestureRecognizer;UITableview只有后兩個(gè)手勢(shì);
一般在含有UIScrollView或者UIScrollView的子類的視圖上添加自己的手勢(shì)就會(huì)有沖突;利用UIGestureRecognizerDelegate中的代理方法可以解決相應(yīng)的沖突;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
該代理方法可以攔截相應(yīng)的手勢(shì),返回YES為攔截手勢(shì);返回NO為不做處理;
相應(yīng)的手勢(shì)被攔截之后,就會(huì)執(zhí)行另一個(gè)代理方法:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
例如:
場(chǎng)景:實(shí)現(xiàn)一個(gè)父子控制器,然后再劃到最兩邊的時(shí)候,實(shí)現(xiàn)抽屜效果;
實(shí)現(xiàn):在主控制器的view上添加pan 手勢(shì),不做任何處理時(shí),系統(tǒng)默認(rèn)執(zhí)行UIScrollView的手勢(shì);在第一個(gè)代理方法中判斷UIScrollView的偏移量,然后攔截手勢(shì);然后在第二個(gè)代理方法對(duì)其進(jìn)行相應(yīng)的處理;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
CGFloat offsetX = self.scrollView.contentOffset.x;
//滿足條件攔截手勢(shì)
if (offsetX == self.scrollView.contentSize.width - screenSize.width || offsetX == 0.0) {
return YES;
}
}
return NO;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint translation = [pan translationInView:self.view];
CGFloat offsetX = self.scrollView.contentOffset.x;
if (translation.x > 0 && offsetX == 0.0 ) {
if ([self.delegate respondsToSelector:@selector(centerControllerPrepareLeftView:)]) {
[self.delegate centerControllerPrepareLeftView:self];
}
}else if (translation.x < 0 && offsetX == self.scrollView.contentSize.width - screenSize.width){
if ([self.delegate respondsToSelector:@selector(centerControllerPrepareRightView:)]) {
[self.delegate centerControllerPrepareRightView:self];
}
}
}
return YES;
}