2012-06-22 14 views
9

Ho un pulsante che voglio far sparire se viene toccato qualcosa oltre al pulsante. Così mi sono messo l'obiettivo: l'azione: per il tasto di cancellazione:Il pulsante tocca l'evento viene sovrascritto da Toccare Gesture Recognizer?

[self.deleteButton addTarget:self action:@selector(deleteButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; 

seguito poi con l'aggiunta del sistema di riconoscimento del rubinetto gesto per la vista contenente:

[self.superview addGestureRecognizer:self.tapOutsideDelete]; 

Quando faccio questo, l'azione per deleteButton è non eseguito, come se il pulsante non fosse riconosciuto. Il riconoscitore di gesti funziona in questo caso. Funziona anche quando tocchi deleteButton, il che mi porta a pensare che il riconoscimento del gesto toccato abbia la priorità sul tocco del pulsante.

Se rimuovo il riconoscimento dei gesti, deleteButton funziona correttamente.

Ovviamente non capisco come gestire questi due eventi insieme. Cosa devo fare?

(deleteButton sta imitando il pulsante di cancellazione di una cella di visualizzazione tabella, ma in questo caso l'ho in una vista di intestazione. Prevedo di chiamare un metodo per far sparire il pulsante di eliminazione quando tocco in qualsiasi punto della tabella eccetto il pulsante stesso, allo stesso modo in cui funziona in una cella.)

+0

si può ottenere un po 'di stranezze aggiungere il sistema di riconoscimento gesto per self.superview invece di sé (o self.view se si tratta di un controller della vista). Questo lo aggiungerebbe al tableview che contiene la vista dell'intestazione, piuttosto che alla vista dell'intestazione, che potrebbe o meno essere ciò che intendete. – MusiGenesis

+0

possibile duplicato di [Gesture di riconoscimento e azioni dei pulsanti] (http://stackoverflow.com/questions/4825199/gesture-recognizer-and-button-actions) –

risposta

12

Sì, il gesto del rubinetto viene commutato al primo tentativo. È necessario implementare il metodo gestureRecognizer:shouldReceiveTouch::

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

    if (touch.view == self.deleteButton) { 
     return NO; 
    } 
    return YES; 
} 
+2

Grazie. Questo ha funzionato perfettamente. È stato necessario un piccolo scavo per scoprire che si tratta di un metodo delegato del protocollo UIGestureRecognizerDelegate, pertanto è necessario impostare anche il puntatore delegato. – Jim

+0

@Jim: scusate, stavo per aggiungere questo. È frustrante il fatto che così tante esercitazioni iOS, ecc. Sul web, non contengano * tutte * le informazioni necessarie per una soluzione, e l'ho appena aggiunto. – MusiGenesis

Problemi correlati