2012-06-04 16 views
19

Ho pensato che quando una vista viene toccata o toccata, il gestore viene chiamato per primo, e quindi viene chiamato il gestore della sua superview (si propaga verso l'alto).Su iOS, se userInteractionEnabled di una superview è NO, anche tutte le sottoview sono disabilitate?

Ma è vero che se il superview è userInteractionEnabled impostato su NO, anche tutte le sottoview e la prole vengono disabilitate per l'interazione dell'utente? Cosa succede se vogliamo disabilitare solo la vista principale ma non vogliamo disabilitare per le visualizzazioni secondarie?

+0

Sì, è corretto. – Lefteris

+0

aha, mi chiedevo quale regola o quale meccanismo dell'UIResponder causi questo ... anche se in questo momento lo memorizzo come un "fatto" –

risposta

13

Non puoi farlo,

Invece si dovrebbe cambiare l'arrangiamento dei vostri punti di vista come segue:

Main View-> subViews 

Per

Container View -> Main View that you want to set as inactive 
       -> other views that you want to still active 

subviews Così la vostra vista principale corrente e attuali diventare fratelli, figli di una nuova vista container

+0

"non posso farlo" Che cos'è "quello"? A quale parte della domanda ti stai riferendo? – Honey

18

Se questo m essere utile, ho trovato questo in Programmazione iOS 5 di Matt Neuburg, p. 467:

userInteractionEnabled

Se impostato su NO, questa vista (e sue subviews) è escluso dalla tocchi riceventi. Tocca su questa vista o su una delle sue sottoview "caduta attraverso" a una vista dietro di essa.

ulteriormente più, Evento di Apple Handling Guida per iOS 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.

e programmazione IOS 5 da Matt Neuburg, p.485 dicono che se una vista è contrassegnato come userInteractionEnabledNO, o hidden come YES, o opacità è vicino a 0, allora la visualizzazione e la sua visualizzazione secondaria non si sposterà per HitTest (e quindi non considerato per alcun tocco).

+1

Informazioni eccellenti per coloro che implementano il proprio 'hitTest: withEvent:'. Non ero sicuro di dover controllare 'if (subview.userInteractionEnabled)' a livello di superview, ma sembra che l'implementazione predefinita controlli la propria proprietà 'userInteractionEnabled'. ' – darvids0n

+0

che cosa significa " " passa attraverso "a una vista dietro di esso." Significa? Significa che toccare i pulsanti che sono sottoview non funzionerà? – Honey

1

Primo metodo

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[SuperViewParent class]]) return FALSE; 
    return TRUE; 
} 

Secondo metodo

UITapGestureRecognizer *r = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(agentPickerTapped:)]; 
    r.cancelsTouchesInView = NO; 
    [agentPicker addGestureRecognizer:r]; 
14

È possibile ignorare hitTest(_:withEvent:) di ignorare la vista stessa, ma ancora fornire tocchi ai suoi subviews.

class ContainerStackView : UIStackView { 
    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     let result = super.hitTest(point, withEvent: event) 
     if result == self { return nil } 
     return result 
    } 
} 
Problemi correlati