8

Ho un gruppo di UIButton s all'interno di un UIView all'interno di un UIScrollView. Sto tentando di aggiungere un indicatore di tocco alla vista di scorrimento. Il riconoscimento del tocco si attiva, ma ora nessuno dei miei pulsanti funziona.iOS5 UITapRecognizer per UIScrollView che interferisce con i pulsanti. Come risolvere?

So che in iOS5, UIScrollView può in qualche modo passare un evento di tocco alla gerarchia di controllo dopo averlo fatto. Qualcuno può aiutarmi a capire come farlo?

risposta

15

Impostare la proprietà cancelsTouchesInView su No. UIGestureRecognizer.

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                          action:@selector(singleTap:)]; 
singleTapGestureRecognizer.numberOfTapsRequired = 1; 
singleTapGestureRecognizer.enabled = YES; 
singleTapGestureRecognizer.cancelsTouchesInView = NO; 
[tapableView addGestureRecognizer:singleTapGestureRecognizer]; 
[singleTapGestureRecognizer release]; 

Da UIGestureRecognizer Class Reference

Un valore booleano che colpisce se tocchi sono consegnati a una vista quando un gesto viene riconosciuto.

Quando questa proprietà è SI (il default) e il ricevitore riconosce il suo gesto, i tocchi di quel gesto che attesa non vengono consegnati alla vista e in precedenza consegnati tocchi sono annullate attraverso un touchesCancelled: withEvent: messaggio inviato a la vista. Se un riconoscitore di gesti non riconosce il suo gesto o se il valore di questa proprietà è NO, la vista riceve tutti i tocchi nella sequenza multitouch .

+1

esattamente quello che mi serviva, grazie per una risposta veloce! :) –

+0

Questo fa sì che sia il pulsante AND il riconoscimento dei gesti sia attivato ... – hfossli

+0

@hfossli corretto. – Till

0

È anche possibile utilizzare il metodo della UIGestureRecognizerDelegate, che è documentata heregestureRecognizer:shouldReceiveTouch:, per ottenere la stessa cosa. Offre un po 'più di flessibilità, ad esempio, se si desidera annullare alcuni tocchi, ma non altri. Ecco un esempio,

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[UIButton class]]) return NO; 

    return YES; 
} 
+0

Questo in realtà non è la stessa cosa. Quando si restituisce NO, il riconoscitore di gesti non gestisce il tocco. Quando si restituisce SÌ, l'UIView non gestisce il tocco. cancelsTouchesInView impostato su NO indica entrambi, il riconoscitore di gesti e la vista ricevono il tocco. – Till

+0

Sei corretto. Se si desidera realizzare entrambi, è possibile gestire l'evento tattile qui * prima di * restituire NO. – john

2

Per me una combinazione delle risposte di cui sopra hanno lavorato

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userDidTap:)]; 
tapRecognizer.cancelsTouchesInView = YES; 
tapRecognizer.delegate = self; 
[tapRecognizer requireGestureRecognizersToFail:self.scrollView.gestureRecognizers]; 
[self.view addGestureRecognizer:tapRecognizer]; 

-

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[UIButton class]] || [touch.view isKindOfClass:[UIButton class]]) 
    { 
     return NO; 
    } 
    return YES; 
} 
+0

Ciò renderebbe impossibile il riconoscimento dei gesti sul pulsante - non è sicuro in che modo questo sia correlato alla domanda. – Till

+0

Sì, lo farà. Nel mio caso è un comportamento ricercato. La domanda non è chiara su questo punto alla mia comprensione. – hfossli