Mecanismo de eventos de iOS (clic, gesto, UIControl)
Nota: Para un solo toque con un dedo, UITouch devolverá la llamada al controlador UIResponder correspondiente cada vez que cambie su estado. Para múltiples toques con los dedos, más de un cambio de estado de UITouch puede devolver la llamada al controlador UIResponder juntos, o cada cambio de estado de UITouch puede devolver la llamada al controlador UIResponder. Por ejemplo, para dos clics, puede haber solo una devolución de llamada de toques iniciados y dos devoluciones de llamada de toques finales. Al mismo tiempo, cuando solo hay un parámetro de devolución de llamada del método touchesBegan de múltiples estados de UIControl que cambia solo una vez en la cantidad de toques que probé, no piense que todas las devoluciones de llamada de UITouch que cambian de estado solo una vez se colocarán en el toque. parámetros. Con respecto al procesamiento multitáctil, personalmente no recomiendo utilizar el mecanismo de respuesta UITouch para el procesamiento. Los principios específicos no están claros y no hay muchas referencias en el desarrollo real.
UIResponder es una API en iOS para manejar eventos de usuario. Puede manejar eventos táctiles, eventos de prensa (3D touch), eventos de control remoto y eventos de movimiento de hardware. El mensaje de devolución de llamada correspondiente se puede obtener mediante métodos como touchesBegan, pressesBegan, motionBegan, remoteControlReceivedWithEvent, etc. UIResponder se usa no solo para recibir eventos, sino también para procesar y entregar los eventos correspondientes, y si el respondedor actual no puede manejar el evento, se reenviará a otro respondedor apropiado.
Las aplicaciones reciben y manejan eventos a través de respondedores, que pueden ser cualquier subclase que herede de UIResponder, como UIView, UIViewController, UIApplication, etc. Cuando ocurre un evento, el sistema entrega el evento al respondedor correspondiente y lo convierte en el primero en responder.
Los eventos que no son manejados por el primer respondedor pasarán a través de la cadena de respuesta. Las reglas de entrega están determinadas por nextResponder de UIResponder, que se puede anular para determinar las reglas de entrega. Cuando llega un evento y el primer respondedor no recibe el mensaje, se pasa hacia atrás a lo largo de la cadena de respuesta.
El reconocedor de gestos es una encapsulación del procesamiento de eventos subyacente y está diseñado para permitir a los usuarios manejar eventos más fácilmente.
Los gestos se dividen en gestos discretos y gestos continuos.
Proceso de respuesta de gestos:
Estado de gestos:
UIControl es un control proporcionado por el sistema, que puede manejar eventos táctiles en el modo de acción objetivo, UIButton, UISegmentedControl, UISwitch, etc. son todas subclases de UIControl.
Cabe señalar que UIConotrol es una subclase de UIView, por lo que tiene su propia identidad como UIResponder.
UIControl, como clase base de la clase de control, es una clase base abstracta que no podemos usar directamente para crear instancias de controles, solo define algunas interfaces comunes para subclases de control y proporciona algunas implementaciones básicas para ellas; preprocesar estos mensajes y enviarlos al objeto de destino especificado cuando ocurre el evento.
El proceso de activación de UIControl:
Los cuatro métodos identificables importantes son inicio táctil (touchBegan), movimiento táctil (touchMoved), final táctil (touchEnded) y cancelación táctil (touchCancelled). en la devolución de llamada.
Presumiblemente: se llama a endTrackingWithTouch para identificar el comportamiento, marcar el comportamiento y luego devuelve touchesEnded para determinar si UIControl puede identificar fácilmente el comportamiento y llamar a la devolución de llamada del comportamiento.
Cuando una aplicación recibe un evento táctil, el evento se coloca en la cola de eventos mantenida por la aplicación UIApplication actual.
Dado que solo hay un evento a la vez, pero muchos respondedores pueden responder al evento, existe un proceso para encontrar al primer respondedor.
Llame a este método para obtener la vista en la que se hizo clic, que es la primera en responder.
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
hitTest:withEvent: el método determina internamente el área en la que se hizo clic llamando al método pointInside: ¿Es así? a la vista.
Después del proceso de prueba de impacto, UIApplication ya sabe quién es el primer respondedor, lo siguiente que debe hacer es:
Los toques iniciados, toques movidos, toques finales y toques cancelados de la vista personalizada están sobrecargados para grabar Durante el proceso de impresión y el gesto tapGestureRecognized se agrega a la vista, también sobrecarga estos cuatro métodos.
Haga clic en la vista para llamar a la salida del proceso de impresión:
Pila de llamadas:
Combinando la salida anterior y la pila de llamadas, es posible que no podamos ver claramente El gesto cuando hay un proceso de clic, pero si lo depura usted mismo, puede sacar las siguientes conclusiones:
La relación entre UIGestureRecognizer y UITouch se puede definir a través de gestos UIGestureRecognized.
La relación entre UIGestureRecognizer y UITouch puede verse afectada por tres propiedades de UIGestureRecognizer: cancelsTouchesInView, delaysTouchesBegan y delaysTouchesEnded.
La relación entre UIGestureRecognizer y UITouch puede verse afectada por tres propiedades de UIResponder: cancelsTouchesInView, delaysTouchesBegan y delaysTouchesEnded. Además, UIResponder proporciona devoluciones de llamada UITouchesMoved, UITouchesEnded y UITouchesCancel.
El procesamiento de las respuestas de UIControl no afecta el procesamiento de la cadena de respuestas de UIResponder, pero un UIControl afecta a otro UIControl y el UIControl de la subvista tiene prioridad.
UIGestureRecognizer y UIControl no tienen prioridad establecida.
A partir de iOS6, agregue gestos apropiados encima de la vista principal del control, y el control controlará el comportamiento del gesto de bloqueo, como:
La luz en UIButton, UISwitch, UIStepper , UISegmentControl, UIPageControl Gesto de toque
Gesto de deslizamiento en UISlider;
Gesto de desplazamiento en UISwitch
Otros comportamientos que pueden ser más adecuados para gestos que para controles.
UIResponder tiene cuatro métodos (como touchesBegan) que se pasan a la supervista de forma predeterminada.
Todas las subclases de UIResponder que necesiten personalizar su lógica de procesamiento de clics anularán estos cuatro métodos.
Los eventos de clic se manejan mediante cuatro métodos.
UIButton también se maneja mediante estos cuatro métodos.
UIGestureRecognizer también tiene cuatro métodos, como touchesBegan.
Los gestos no están en la cadena de respuesta, sino que también monitorean los clics en sus vistas y subvistas.
UIGestureRecognizer afecta a los cuatro métodos de UIResponder que responden a los clics.
Descripción de los pasos clave de la respuesta del evento de clic predeterminado:
1) El dedo del usuario hace clic en la pantalla, que se pasará a UIApplication a través del sistema, y UIApplication encontrará el evento UITouch correspondiente a través de hitTest. Una vista de respuesta:
2) UIApplication actualiza el estado del gesto Desde el gesto del primer respondedor hasta los gestos de todas las vistas anteriores en su capa de vista, se recibirá UITouch. , actualizando así el estado del gesto
3) UIApplication entrega UITouch a la vista de primer respondedor que encuentra para procesar
4) UIApplication actualiza el estado del gesto y lo reconoce correctamente, lo enviará a la vista del primer respondedor de UITouch para su procesamiento. El respondedor envía un método de cancelación.
Agregar UIControl complicará el proceso. No conozco el principio de UIControl y no me atrevo a sacar conclusiones. Internet y pruebas reales, puedo inferir aproximadamente los siguientes puntos:
1) No afectará el proceso de respuesta de UITouch en sí, pero afectará la respuesta de otros UIControl y UIGestureRecognizer
2) El proceso de respuesta de UIControl personalizado y UITouch en sí es el mismo
p>
3) El UIControl y UIGestureRecognizer definidos por el sistema son los mismos. UIGestureRecognizer tiene la misma prioridad. Quien lo reconozca primero saldrá. Sin embargo, hay una diferencia entre UIControl y UIGestureRecognizer: no cancelará el proceso UITouch.
Descripción del impacto entre UITouch, UIGestureRecognizer y UIControl:
1) UITouch y UIGestureRecognizer: UIGestureRecognizer tiene una prioridad más alta que UITouch y está controlado por los tres parámetros de UIGestureRecognizer: cancelsTouchesInView , retrasosTouchesBegan, retrasosTouchesEnded para determinar el impacto en UITouch De forma predeterminada, después de que UIGestureRecognizer se reconozca correctamente, la cancelación se enviará a UITouch
Evite:
1) Intente no sobrescribir touchesBegin y. touchMoved de UIResponder, touchCancelled, touchEnded, si se requiere sobrescribir y reescribir, la lógica debe ser lo más simple posible y no se debe realizar ningún procesamiento complejo
2) No personalice UIControl
<. p> 3) No usar UIControl Agregar una subvista UIControl4) No confiar en delayTouchBegin y delayTouchEnded de UIGestureRecognizer
5) No personalizar UIGestureRecognizer
Referencia artículo:
1) Mecanismo de entrega de eventos de iOS (UITouch, UIControl, UIGestureRecognizer)
2) Tutorial de entrega de eventos táctiles - Parte 1