UIPanGestureRecognizer 左右滑動卡片,下拉滑動就是下拉刷新

做項目遇到手勢衝突問題.

  爲了實現右滑划走,左滑划過來.下拉是下拉刷新功能.思考良久.我的卡片在tableview的header頭視圖上,所以左右滑能實現,卡片手勢上下滑,沒法帶動下拉刷新.因爲下拉刷新放在tableview上.

其實tableview繼承UIScrollView自帶默認手勢

@property(nonatomic, readonly) UIPanGestureRecognizer *panGestureRecognizer NS_AVAILABLE_IOS(5_0);

    開始通過獲取卡片手勢位移座標

- (CGPoint)translationInView:(nullable UIView *)view; 

 

   判斷左右上下滑動方向.做事件分發處理.改變tableview的contentoffset但是發現tableview的下拉刷新通過判斷 dragging,但是

@property(nonatomic,readonly,getter=isDragging)     BOOL dragging; 是隻讀的

   所以最後還是從手勢上面下功夫,通過查博客,看API文檔,發現手勢的代理方法,部分如下:


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

詢問一個手勢接收者是否應該開始解釋執行一個觸摸接收事件 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

 一個控件的手勢識別後是否阻斷手勢識別繼續向下傳播,默認返回NO;如果爲YES,響應者鏈上層對象觸發手勢識別後,如果下層對象也添加了手勢併成功識別也會繼續執行,否則上層對象識別後則不再繼續傳播;簡單來說返回false響應一個,返回true 都響應


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);

上面兩個大致意思,每個視圖都可以設置到,可以在兩個之間設置交互.返回yes當前手勢有效,false當前手勢無效(第一條是這樣)


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

詢問delegate是否允許手勢接收者接收一個touch對象 

 // 返回YES,則允許對這個touch對象審覈,NO,則不允許。  

// 這個方法在touchesBegan:withEvent:之前調用,爲一個新的touch對象進行調用 


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press;

   是否允許接受按得手勢


最後解決辦法是

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{

    NSLog(@"%@",[[otherGestureRecognizer view] class]);

    if ([[otherGestureRecognizer view] isKindOfClass:[CarCardView class]]) {

        NSLog(@"%.2f,%.2f",[(ZYZPanGestureRecognizer*)otherGestureRecognizer translationInView:self].y,[(ZYZPanGestureRecognizer*)otherGestureRecognizer translationInView:self].x);

        if (fabs([(ZYZPanGestureRecognizer*)otherGestureRecognizer translationInView:self].y) > fabs([(ZYZPanGestureRecognizer*)otherGestureRecognizer translationInView:self].x)) { //上下拉

            [self cancelOtherGestureRecognizer:otherGestureRecognizer];

           // [self cancelOtherGestureRecognizer:gestureRecognizer];

        }else{

            //[self cancelOtherGestureRecognizer:gestureRecognizer];

        }

    }

    return NO;// 同時響應,false就是響應一個

}


//取消當前手勢響應事件

- (void)cancelOtherGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

{

    ZYZPanGestureRecognizer *ges = (ZYZPanGestureRecognizer*)otherGestureRecognizer;

    NSSet *touchs = [ges.event touchesForGestureRecognizer:otherGestureRecognizer];

    [otherGestureRecognizer touchesCancelled:touchs withEvent:ges.event];

}


 讓多個手勢同時,只響應一個手勢,判斷位移,當前卡片手勢左右位移,只顯示一個沒問題.當手勢顯示下拉,則取消當前手勢的響應.默認取到手勢響應鏈的上一層實現了,下拉刷新.
參考鏈接:
http://blog.csdn.net/namehzf/article/details/7424882
http://www.cnblogs.com/kenshincui/p/3950646.html
有不對的地方歡迎指出



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章