2012-06-04 15 views
19

Pensé que cuando se toca o toca una vista, se llama primero a su manejador, y luego se llama al manejador de su vista (se propaga hacia arriba).En iOS, si el userInteractionEable de una supervista es NO, ¿todas las subvistas también están deshabilitadas?

¿Pero es cierto que si el userInteractionEnabled de la supervista se establece en NO, entonces todas las subvistas y descendientes también se deshabilitan para la interacción del usuario? ¿Qué sucede si queremos inhabilitar solo la vista principal pero no queremos deshabilitarla para las subvistas?

+0

Sí, es correcto. – Lefteris

+0

aha, me preguntaba qué regla o qué mecanismo del UIResponder causa esto ... aunque en este momento lo memorizo ​​como un "hecho" –

Respuesta

13

Usted no puede hacer eso,

lugar que iba a cambiar la Arrangment de sus puntos de vista como el siguiente:

Main View-> subViews 

Para

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

subvistas Por lo que su vista principal actual y actuales convertirse en hermanos, hijos de un contenedor nuevo ver

+0

"no puedo hacer eso" ¿Qué es "eso"? ¿A qué parte de la pregunta se refiere? – Honey

18

Si este m ay ayúdame, encontré esto en Programming iOS 5 por Matt Neuburg, p. 467:

userInteractionEnabled

Si se establece en NO, este punto de vista (junto con sus subvistas) se excluye de toques que reciben. Toca en esta vista o en una de sus subvistas "caer hasta" a una vista detrás de ella.

Adicionalmente, Evento de Apple guía para el manejo de iOS dice:

El objeto de la ventana de pruebas utiliza golpear y la cadena de respuesta para encontrar la visión para recibir el evento táctil. En la prueba de aciertos, una ventana llama al hitTest: withEvent: en la vista superior de la jerarquía de vistas; este método procede recursivamente llamando a pointInside: withEvent: en cada vista en la jerarquía de vista que devuelve SÍ, siguiendo por la jerarquía hasta que encuentra la subvista dentro de cuyos límites se realizó el toque . Esa vista se convierte en la vista de prueba de golpe.

y Programación iOS 5 por Matt Neuburg, p.485 mencionado que si una vista está marcado userInteractionEnabled como NO, o hidden como YES, o la opacidad está cerca de 0, entonces la vista y no se va a desplazar su subvista por HitTest (y por lo tanto no se considera para ningún contacto).

+1

Excelente información para aquellas personas que implementan su propia 'hitTest: withEvent:'. No estaba seguro de si necesitaba verificar 'if (subview.userInteractionEnabled)' en el nivel de supervista, pero parece que la implementación predeterminada verifica su propia propiedad 'userInteractionEnabled'. ' – darvids0n

+0

¿Qué significa "caerse" a una vista detrás de él. "¿Significa eso que significa que tocar botones que son subvistas no funcionará? – Honey

1

Primer método

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

Segundo método

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

Puede anular hitTest(_:withEvent:) ignorar la vista en sí, pero aún así ofrecer a sus toques subvistas.

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 
    } 
} 
Cuestiones relacionadas