iphone - recuerdo - restricciones ios 12
En iOS, si un usuario de InterviewInteractionEnabled es NO, ¿todas las subvistas también están deshabilitadas? (4)
Pensé que cuando se tocaba o tocaba una vista, primero se llamaba a su manejador y luego se llamaba al manejador de su supervisor (propagarse hacia arriba).
Pero, ¿es cierto que si userInteractionEnabled de userInteractionEnabled
está configurado en NO, entonces todas las subvistas y descendientes también están deshabilitadas para la interacción del usuario? ¿Qué sucede si queremos deshabilitar solo para la vista principal pero no queremos deshabilitar para las subvistas?
No puedes hacer eso,
En su lugar, cambiaría el arreglo de sus puntos de vista como sigue:
Main View-> subViews
A
Container View -> Main View that you want to set as inactive
-> other views that you want to still active
Por lo tanto, su vista principal actual y sus subvistas actuales se convertirán en hermanos, hijos de una nueva vista de contenedor.
Puede anular hitTest(_:withEvent:)
para ignorar la vista en sí misma, pero aún así puede dar toques a sus 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
}
}
Si esto puede ser útil, encontré esto en Programación iOS 5 por Matt Neuburg, pág. 467:
userInteractionEnabled
Si se establece en NO, esta vista (junto con sus subvistas) se excluye de recibir toques. Los toques en esta vista o en una de sus subvistas "caen" a una vista detrás de ella.
Además, la Guía de Manejo de Eventos de Apple para iOS dice:
El objeto de la ventana utiliza la prueba de aciertos y la cadena de respuesta para encontrar la vista para recibir el evento táctil. En hit-testing, una ventana llama a hitTest: withEvent: en la vista superior de la jerarquía de vistas; este método se realiza mediante una llamada recursiva a pointInside: withEvent: en cada vista en la jerarquía de vistas que devuelve YES, avanzando hacia abajo en la jerarquía hasta que encuentre la subvista dentro de cuyos límites se realizó el toque. Esa vista se convierte en la vista de prueba de éxito.
y la Programación iOS 5 por Matt Neuburg, p.485 mencionó que si una vista está marcada como userInteractionEnabled
como NO
, u hidden
como YES
, o si la opacidad es cercana a 0, la vista y su subvista no serán recorridas por HitTest
(y por lo tanto no considerado para cualquier toque).
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];