2011-12-03 14 views
7

Ho una sottoclasse di UIView su uno UITableView. Sto usando il UITableView per visualizzare alcuni dati e, allo stesso tempo, vorrei sovrapporre un'animazione che segue il dito (ad esempio, lasciando una traccia).Evento di tocco gestito da più viste

Se ho capito bene, ho bisogno gli eventi touch per essere gestiti sia dal UIView sottoclasse e la UITableView. Come lo posso fare? È possibile avere, ad esempio, touchesMoved attivato nella sottoclasse UIView e quindi su UITableView?

Grazie mille per qualsiasi aiuto.

risposta

10

Il modo in cui ho risolto questo problema è in un modo che non è pulito, ma funziona. Per favore fatemi sapere se c'è un modo migliore per farlo.

Ho sostituito per la mia dogana UIView in modo da indirizzare i tocchi allo UITableView sottostante. Quindi nello UITableView sto gestendo i gesti tramite touchesBegan, touchesMoved, ecc. Ci sto anche chiamando touchesBegan su UIView.

In questo modo i tocchi vengono gestiti da due visualizzazioni. Il motivo per cui non sto facendo il contrario (con 's) è che i riconoscimenti di gesti sullo UITableView non funzionerebbero.

UIView sottoclasse hitTest

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    // tview is the UITableView subclass instance 
    CGPoint tViewHit = [tView convertPoint:point fromView:self];   
    if ([tView pointInside:tViewHit withEvent:event]) return tView; 

    return [super hitTest:point withEvent:event]; 
} 

UITableView di sottoclasse touchesBegan

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; 
    // .... 

    // view is the UIView's subclass instance 
    [view touchesBegan:touches withEvent:event]; 
} 
+0

molto bello .. stavo cercando di fare dopo un po 'qualcosa di simile. Grazie per la pubblicazione. – riship89

+0

Mi piace molto questo. Ho provato così tanto tempo a farlo nel modo sbagliato, chiamando manualmente TouchesBegan, ecc. Nella sottoview. Questo metodo funziona alla grande! – Gandalf458

0

UITableView relays eventi di tocco non gestiti su UIView. (Google "catena responder") UITableView Documentation

Quindi, è in grado di gestire i tuoi eventi touch solo in UIView. Così. Nella tua UIView

  1. touchesstart - fare cose inizializzazione

  2. touchesmove - disegnare coda UIView (Utilizzare i timer/delayedresponse ai punti desable in modo che sarebbe simile a una scia)

  3. touchesend - fare cose rimanenti

Spero che questo aiuti.

+0

Grazie per la risposta, ma non sono sicuro Capisco perfettamente (in particolare non capisco il significato della prima frase) . So che posso tracciare il percorso in UIView ma dovrei comunque "passare" gli eventi tattili a UITableView (per scorrere, selezionare, ecc.). Scusa se ho frainteso. –

+0

In Objective-C, c'è qualcosa chiamato catena responder. Se una classe non gestisce eventi particolari, questi sono necessari per essere gestiti dalla sua classe Super. Se nessuna classe ha gestito quell'evento, in ultima analisi quell'evento è gestito da NSObject. Quindi, nel tuo caso come UIView è la superclasse di UITableView, puoi rispondere agli eventi di UITableView da UIView. – riship89

+0

Mi scuso se non sono particolarmente esperto con Objective-C ... potresti per favore fare un esempio di come questo potrebbe applicarsi al caso potrebbe? Dovrei avere il manico UITableView dei gesti e poi passarli sulla superclasse? Come? –

1

No, non lo fai implicito. Event Delivery capitolo dice

L'oggetto finestra utilizza hit-test e la catena risponditore per trovare la vista per ricevere l'evento di tocco. In hit-testing, una finestra chiama hitTest: withEvent: nella vista più in alto della gerarchia della vista; questo metodo procede chiamando ricorsivamente pointInside: withEvent: su ciascuna vista nella gerarchia di viste che restituisce SÌ, procedendo lungo la gerarchia fino a quando non trova la sottoview entro i cui limiti è stato effettuato il tocco . Quella vista diventa la vista hit-test.

Quindi, quando la finestra trova toccata la vista restituisce SI. Solo una vista può gestire i tocchi nel momento attuale.

Ma se è necessario gestire l'evento per UITableView, gestirlo per UIView! Puoi convertire il punto toccato con le coordinate richieste con le funzioni – convertPoint, – convertRect, aggiungere sottomenu a UITableView e spostarlo in base alle coordinate e molte altre cose.

+0

Questo potrebbe sicuramente funzionare. Potrei avere più elementi "sotto" la sottoclasse di UIView ... devo ripetere il processo per tutti questi elementi? Inoltre, ho bisogno di convertire le coordinate per ottenere le coordinate globali, giusto? Grazie. –

+0

Ho fatto come suggerito ma non riesco più a scorrere UITableView. Sai perché? Grazie –

Problemi correlati