objective c - Conflict btwn PanGesture and TapGesture -


my app consists of deck of cards. cards in deck made in draggableview. i'm trying make double tap on screen make buttons on card disappear/reappear. after reading post, tried give shot. put uitapgesture initwithframe method in draggableview class, so:

- (id)initwithframe:(cgrect)frame self = [super initwithframe:frame]; if (self) {     [self addsubviewfromnib];     [self setupview];     pangesturerecognizer = [[uipangesturerecognizer alloc]initwithtarget:self action:@selector(beingdragged:)];     cardwidth = frame.size.width;     cardheight = frame.size.height;     type = 0;     pangesturerecognizer.delegate = self;     pangesturerecognizer.cancelstouchesinview = no;     _backgroundscrollview.pangesturerecognizer.cancelstouchesinview = no;     //...more code above....     _backgroundscrollview.userinteractionenabled = yes;     tapgesturerecognizer = [[uitapgesturerecognizer alloc]   initwithtarget:_backgroundscrollview action:@selector(doubletap)];     tapgesturerecognizer.delegate = _backgroundscrollview;     tapgesturerecognizer.numberoftapsrequired = 2; [_backgroundscrollview addgesturerecognizer:tapgesturerecognizer]; [self addgesturerecognizer:pangesturerecognizer];  }   - (void) doubletap: (uitapgesturerecognizer *)tapgesturerecognizer{      _mapbutton.hidden = !_mapbutton.hidden;     _menubutton.hidden = !_menubutton.hidden;     _phonebutton.hidden = !_phonebutton.hidden;     reviewbutton.hidden = !reviewbutton.hidden;     _sharebutton.hidden = !_sharebutton.hidden;  }   - (bool)gesturerecognizer:(uigesturerecognizer *)gesturerecognizer shouldberequiredtofailbygesturerecognizer:(uigesturerecognizer *)othergesturerecognizer {      // if gesture recognizer uitapgesturerecongizer, other     // gesture detected uipangesturerecognizer, require     // uitapgesturerecognizer fail.     if ([gesturerecognizer iskindofclass:[uitapgesturerecognizer class]] &&         [othergesturerecognizer iskindofclass:[uipangesturerecognizer class]]) {         return yes;     } else {         return no;     } }    - (bool)gesturerecognizershouldbegin:(uigesturerecognizer *)gesturerecognizer {     if ([gesturerecognizer iskindofclass:[uitapgesturerecognizer class]]) {         return yes;     }     if ([gesturerecognizer iskindofclass:[uipangesturerecognizer class]]) {         uipangesturerecognizer *pangesture = (uipangesturerecognizer *)gesturerecognizer;         cgpoint velocity = [pangesture velocityinview:self];         return fabs(velocity.y) <= fabs(velocity.x);     }     return yes; } 

however, if double tap, sib abrt error:

 -[uitapgesturerecognizer velocityinview:]: unrecognized selector sent instance 0x7f9f9a244230  *** terminating app due uncaught exception 'nsinvalidargumentexception', reason: '-[uitapgesturerecognizer velocityinview:]: unrecognized selector sent instance 0x7f9f9a244230' 

i'm assuming means there's error between pangesturerecognizer , tapgesture recognizer. how resolve it?

edit: still unresolved, if change tapgesture added draggable view(thus, self), rather _backgroundscrollview, error:

terminating app due uncaught exception 'nsinvalidargumentexception', reason: '-[draggableview doubletap]: unrecognized selector sent instance 0x7fefdd9e4f70' 

other edit: changed backgroundscrollview, , error:

[uiscrollview doubletap]: unrecognized selector sent instance 0x7fe5130af000 

gesturerecognizershouldbegin called, whenver gesture recogniser procss touches, either tap gesture or either pan gesture. need check gesturerecogniser type , proceed further.

implement following method(taken here) allow simultaneous gestures recognised:

 - (bool)gesturerecognizer:(uigesturerecognizer *)gesturerecognizer shouldberequiredtofailbygesturerecognizer:(uigesturerecognizer *)othergesturerecognizer {      // if gesture recognizer uitapgesturerecongizer, other     // gesture detected uipangesturerecognizer, require     // uipangesturerecognizer fail.     if ([gesturerecognizer iskindofclass:[uitapgesturerecognizer class]] &&         [othergesturerecognizer iskindofclass:[uipangesturerecognizer class]])  {        return yes;     } else {        return no;     } } 

and in other delegate method, crash reason tells that:

-[uitapgesturerecognizer velocityinview:]: unrecognized selector sent instance 0x7f9f9a2 

velocityinview being called on wrong gesture type, avoid these kind of errors, modify delegate method below:

- (bool)gesturerecognizershouldbegin:(uigesturerecognizer *)gesturerecognizer  {   if ([gesturerecognizer iskindofclass:[uitapgesturerecognizer class]]) {             return yes;   }   if ([gesturerecognizer iskindofclass:[uipangesturerecognizer class]]) {         uipangesturerecogniser *pangesture = (uipangesturerecongiser *)gesturerecogniser;            cgpoint velocity = [pangesture velocityinview:self];        return fabs(velocity.y) <= fabs(velocity.x);   }    return yes; } 

Comments