2012-05-07 13 views
5

Configurazione: ho la vista padre A. Ha una vista figlio B. B è parzialmente all'interno dei limiti di A, ma parzialmente all'esterno (A ha clipToBounds = falso). Ho allegato UITapGestureRecognizer (UITGR) a B.Come licenziare UITapGestureRecognizer su una vista figlia parzialmente ritagliata dalla vista genitore?

Osservato: l'UITGR si attiva quando tocchi la parte di B che si trova all'interno dei limiti di A. L'UITGR NON spara quando tocco la parte di B che è all'esterno i limiti di A.

Previsto/domanda: Come faccio a far bruciare UITGR quando tocco la porzione di B che è fuori dai limiti di A?

risposta

6

Questa citazione sarà rispondere alla tua domanda sul motivo per cui si comporta così:

Eventi di tocco. L'oggetto window utilizza hit-testing e la catena responder per trovare la vista per ricevere l'evento touch. In hit-testing, una finestra chiama hitTest: withEvent: nella parte superiore della vista della gerarchia della vista; questo metodo procede ricorsivamente chiamando pointInside: withEvent: su ogni vista nella gerarchia della vista che restituisce SÌ, procedendo lungo la gerarchia finché non trova la sottoview entro cui si è verificato il tocco. Quella vista diventa la vista hit-test. (source)

Una soluzione è quella di creare il proprio UITapInSubviewsView con la seguente definizione per hitTest:

(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    NSEnumerator *reverseE = [self.subviews reverseObjectEnumerator]; 
    UIView *iSubView; 
    while ((iSubView = [reverseE nextObject])) { 

     UIView *viewWasHit = [iSubView hitTest:[self convertPoint:point toView:iSubView] withEvent:event]; 
     if(viewWasHit) 
      return viewWasHit; 
    } 
    return [super hitTest:point withEvent:event]; 
} 

quindi si utilizza questa classe per la vostra vista padre.

(Ho trovato questo codice in un post di S.O. alcune settimane fa, ma non riesco a trovarlo più, quindi l'ho appena copiato dal mio progetto).

0

si deve scrivere la propria funzione hitTest per la vista A.

veda anche questa domanda: UITapGestureRecognizer not triggered in deep view hiearchy

+0

Puoi ampliare la risposta un po 'per la causa di ciò: è perché l'ignora di default che tocca ignora i limiti della vista genitore? E ho bisogno di testare me stesso se il tocco è in limiti del bambino? – Jaanus

Problemi correlati