2014-05-06 9 views
9

Ho la seguente configurazione.Come passare l'evento tattile a superview quando userInteractionEnabled = YES?

+- XXXCustomControl : UIControl -------+ 
| A         | 
| +- ContentView -------------------+| 
| |         || 
| | B        || 
| |         || 
| +---------------------------------+| 
+--------------------------------------+ 

Un XXXCustomControl che è una sottoclasse di UIControl. Contiene una sottoview chiamata contentView di tipo UIView con dimensioni minori dell'area del Control. Quella vista ha .userInteractionEnabled = YES;

Ho bisogno che la proprietà sia impostata su SÌ, perché le visualizzazioni di scorrimento orizzontali vengono inserite di tanto in tanto e devono essere scorrevoli. Se la superview (nel nostro caso la visualizzazione del contenuto non consentirebbe l'interazione dell'utente, questo è ereditato dalle sottoview.) Ma allo stesso tempo questo XXXCustomControl deve essere intercettabile quando non contiene scrollview nella sua vista del contenuto non solo nell'area A ma anche nella zona B.

quindi ho un "conflitto di interessi" qui perché sia ​​

1) impostare la visualizzazione del contenuto di userInteractionEnabled = NO, allora posso toccare il controllo vuota nell'area di visualizzazione contenuto sia in A e B, ma le schermate di scorrimento che inserirò non saranno scorrevoli ..

2) impostare la visualizzazione del contenuto su userInteractionEnabled = YES, ma poi, se il Controllo è vuoto, Posso solo toccare l'area A per attivare un evento tattile.

Un'idea che ho trovato è che ho impostato la proprietà su NO di default e quando popolo il contentView l'ho impostato su yes. quando cancello il contentView ho impostato di nuovo la proprietà su no. Fondamentalmente voglio che questo sia impostato su yes per tutto il tempo, e quando è vuoto, forzare il contentView a passare l'evento touchUpInside alla sua superview.

È possibile?

+1

Se vi interessa soltanto rubinetto perché non aggiungere un gesturerecognizer alla vista del bambino che è l'azione è lo stesso di Gesturerecognizer nella visualizzazione padre? Sembra l'implementazione più semplice. – Putz1103

+0

Perché non hai assegnato una risposta? Michaels funziona per me ... –

+0

Meglio tardi che mai ... –

risposta

13

Si potrebbe provare a sovrascrivere il metodo pointInside:withEvent: nella vista interna. Questo vi permetterà di tornare NO quando si desidera inoltrare tocchi al superview:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if(/* You have content, and you want to receive touches */){ 
     return YES; 
    }else{ 
     return NO; 
    } 
} 
+0

Funziona bene anche per una vista contenuta in una vista contenitore - per consentire l'esistenza di alcuni controlli nella vista del contenitore (super). Interagisci solo attraverso i riquadri della sottoview - se nessun hit restituisce NO –

3

È possibile creare una sottoclasse vostra visualizzazione secondaria, e implementare

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (!touchedContent) { 
     [[self nextResponder] touchesBegan:touches withEvent:event]; 
    } else { 
     [super touchesBegan:touches withEvent:event]; 
    } 
} 
0

È possibile utilizzare un altro UIView a "nascondere" la visualizzazione secondaria .

* Dettagli: questo UIView è il fratello della sottoview. ha le stesse dimensioni e la stessa posizione della sottoview con il colore di sfondo di colore chiaro.

* Spiegare: Il nuovo UIView prenderà il tocco e lo passerà automaticamente al superview.

In questo modo non è necessario eseguire la sottoclasse della sottoview: è una soluzione per lo storyboard.
Si prega di provare questo. Divertiti!

0

Utilizzare questo in vista super, senza modificare il codice subviews (dal subviews possono essere introdotti da altre discipline o baccello):

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *view = [super hitTest:point withEvent:event]; 
    if ([view isDescendantOfView:self]) 
    { 
     NSLog(@"touched inside"); 
    } 
    return view; 
} 
Problemi correlati