如何解決tableView(UIScrollView)與其subview的手勢沖突問題

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

手勢沖突1.gif

然后我希望每個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,達到了我們要的效果:


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

相關閱讀更多精彩內容

  • 事情起因是新項目,產品要做雜志翻頁風格,也不不顯示導航、標簽欄、返回鍵,返回由下滑手勢出發(fā),上滑會從底部顯示足跡,...
    vincent涵閱讀 6,367評論 6 9
  • 在第十八章中,您通過實現(xiàn) UIResponder 的方法來處理原始觸摸。 有時你想檢測一個特定的觸摸模式——手勢,...
    titvax閱讀 1,379評論 6 3
  • 在iOS開發(fā)中經常會涉及到觸摸事件。本想自己總結一下,但是遇到了這篇文章,感覺總結的已經很到位,特此轉載。作者:L...
    WQ_UESTC閱讀 6,237評論 4 26
  • 好奇觸摸事件是如何從屏幕轉移到APP內的?困惑于Cell怎么突然不能點擊了?糾結于如何實現(xiàn)這個奇葩響應需求?亦或是...
    Lotheve閱讀 59,431評論 51 604
  • 這對兔子在心中長草許久了,終于如愿以償?shù)刈龊昧怂鼈儯瑳]有想到的那么難。 許多事情就是如此,只有嘗試了才知道到底難不...
    葉樣悠閱讀 267評論 1 4

友情鏈接更多精彩內容