做項目遇到手勢衝突問題.
爲了實現右滑划走,左滑划過來.下拉是下拉刷新功能.思考良久.我的卡片在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];
}