最近做的一個項目,基本情況可以這樣描述:一個tableView,每個cell占據(jù)一個頁面,paging enabled屬性設置為YES,那么上下滑動會翻頁,每個cell都有一個立方體:

然后我希望每個cell都可以在手指左右滑的時候,立方體能夠旋轉!你會想到加一個手勢不就行了么,是的,我也是這么做的:
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
pan.delegate = self;
[self.contentView addGestureRecognizer:pan];
- (void)handlePan:(UIPanGestureRecognizer *)pan
{
CGPoint point = [pan translationInView:self];
switch (pan.state)
{
case UIGestureRecognizerStateBegan:
self.prePoint = point;
break;
case UIGestureRecognizerStateChanged:
[self changeCubeWithPoint:point prePoint:self.prePoint screenSize:self.screenSize];
self.prePoint = point;
break;
default:
break;
}
}
但是你很快會發(fā)現(xiàn),你的cell中的立方體確實在轉動,但是不能上下翻頁了。很顯然是UIPanGestureRecognizer和scrollView的滑動手勢沖突了,解決辦法是設置UIPanGestureRecognizer的代理UIGestureRecognizerDelegate,并實現(xiàn)代理方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
-(BOOL)gestureRecognizer(UIGestureRecognizer*)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer方法的含義是該手勢能否與其它手勢一起被識別,如果按照上面這樣寫,你會發(fā)現(xiàn)確實既可以滑動又可以轉立方體了,但是滑動立方體的時候,你會很容易就誤翻頁了,tableView太不聽話了。真正希望的效果是在橫向滑動的時候,立方體轉動但是tableView別亂動,快速上下滑的時候tableView再翻頁!把上面的方法改成下面的:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
{
switch (gestureRecognizer.state)
{
case UIGestureRecognizerStateBegan:
{
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint velocity = [pan velocityInView:self];
CGFloat Vx = fabs(velocity.x);
CGFloat Vy = fabs(velocity.y);
return !(Vx > Vy - 50.0 || Vy < 400.0 || Vx > 500.0);
}
break;
case UIGestureRecognizerStateChanged:
return NO;
break;
default:
break;
}
}
return YES;
}
意思就是手勢開始的時候,如果發(fā)現(xiàn)橫向滑動速度Vx比較大的時候,不要去滑動tableView了,如果UIPanGestureRecognizer手勢開始了(UIGestureRecognizerStateChanged),也不要去滑動了,只有當開始的時候上下滑速度Vy比較大的時候,才去滑動tableView,達到了我們要的效果:
