¿Qué sucede entre el momento en que el usuario toca la pantalla y el momento en que el programa responde? --- respuesta de evento de iOS
Cuando operamos un teléfono móvil, generalmente tenemos tres métodos: tocar la pantalla, agitar el teléfono y controlar a distancia. Los tipos de eventos correspondientes son:
1. Multitáctil. evento
2. Evento de acelerómetro
2. (Evento de acelerómetro
3. Evento de control remoto
4. (Evento de control remoto
Cuando ocurren estos eventos, iOS genera una cadena de respuesta que busca al primer respondedor, envía el evento y luego maneja el evento para completar la acción.
Una cadena de respuesta, como la. Como sugiere el nombre, es una colección de objetos de respuesta que forman una jerarquía. Cocoa estipula que cualquier objeto que herede de UIResponder o una subclase de UIResponder se puede utilizar como objeto de respuesta, como UIApplication, UIViewController y UIView.
En respuesta al toque del usuario, la aplicación realizará los siguientes tres pasos:
1. Generar un evento Cuando el usuario toca la pantalla, se generará un evento táctil y se colocará en el evento. cola administrada por la aplicación, el evento más destacado en la cola se saca y se entrega a Window para su procesamiento.
2. Encuentre el primer objeto de respuesta Después de recibir el evento, Window buscará el último. evento en la jerarquía de vistas. El objeto adecuado para manejar el evento suele ser el objeto en una ventana que es más adecuado para manejar el evento actual.
3. Manejar el evento Generalmente, el primer objeto que responde. el evento es el último. Si un objeto de respuesta no puede manejar el evento, el evento se pasará al siguiente objeto de respuesta hasta que la aplicación
En la serie de operaciones anterior, UIApplication, UIViewController y UIView participan en la respuesta. del evento como objetos de respuesta.
Cuando Window recibe un evento, busca el primer objeto de respuesta en una dicotomía, generalmente la vista de nivel superior en la que el usuario hizo clic. p> El objeto de instancia de Window es el primero. Llamar a hitTest:withEvent: en su vista de contenido y luego llamar a pointInside:withEvent: en cada vista en su jerarquía de vistas llamará a pointInside:withEvent: en cada vista en su jerarquía de vistas. si la ubicación donde ocurre el evento de clic está dentro del alcance de la vista actual para determinar si el usuario hizo clic en la vista actual), si pointInside:withEvent: devuelve verdadero, se continuará llamando paso a paso hasta que ocurra la operación táctil. La posición, es decir, la vista que se va a encontrar
El proceso de procesamiento del método hitTest:withEvent: es el siguiente:
Primero llame al método pointInside:withEvent: del actual. vista para determinar si el punto de contacto es actual En la vista, si este método devuelve falso, el método hitTest: withEvent: devuelve verdadero y el método hitTest: withEvent: devuelve falso.
withEvent: el método determina si el punto de contacto está dentro de la vista actual; si devuelve falso, el método hitTest: withEvent: correspondiente devuelve nil; si devuelve verdadero, hitTest: withEvent: los mensajes se enviarán a todas las subvistas de la vista actual; una determinada subvista La vista devuelve un objeto no nulo o hasta que se hayan atravesado todas las subvistas. Si el método pointInside:withEvent: de la subvista devuelve verdadero, el método hitTest:withEvent: correspondiente devolverá el objeto hasta que el objeto se devuelva a la aplicación; es decir, el proceso finaliza.
Combinemos un ejemplo para profundizar nuestra comprensión:
Supongamos que la vista A es la vista raíz de Windows, y después de que el usuario señala la vista E:
1. La ventana primero realizará una prueba de impacto en la vista A. Específicamente, la vista A llama a hitTest:withEvent:, y luego la vista A llama a pointInterface:withEvent:, que tiene el mismo efecto que hitTest:withEvent:. Luego, Window llamará al método pointInside:withEvent:, que obviamente devolverá verdadero y realizará una prueba de impacto en todas las subvistas de la vista A (vista B, vista C);
2. La vista B llama a pointInside: withEvent: método, este método devuelve falso, correspondiente a hitTest:withEvent: devuelve nil;
3. Ver C llama al método pointInside:withEvent:, que devuelve verdadero, y luego todas las subvistas de la vista C (Ver D, Vista E) realice pruebas de aciertos
4. La Vista D llama al método pointInside:withEvent:, que devuelve falso, y el método hitTest:withEvent: correspondiente devuelve nil; 5. La vista E llama al método pointInside:withEvent:, devuelve verdadero y la vista E ya no tiene subvistas, luego hitTest:withEvent: devolverá la vista E más tarde, la vista C correspondiente a hitTest:withEvent: también devolverá la vista E, la vista A; También devolverá la vista E.
Una vez que la aplicación conoce el primer objeto de respuesta, entregará el evento al primer objeto de respuesta para su procesamiento. Si el primer objeto de respuesta puede manejar con éxito el evento, toda la respuesta finaliza, pero si el primero. objeto de respuesta Si un objeto de respuesta no puede manejar el evento, el evento se pasará al siguiente objeto de respuesta (nextResponder) y se pasará a la cadena de respuesta. Rastreo Entonces, ¿quién es el siguiente objeto de respuesta después del primer objeto de respuesta? La siguiente imagen explica esto:
Ejemplo a la izquierda:
1. Si la vista inicial que recibe el evento no puede manejar el evento, entonces el evento se pasará a su SuperView, y SuperView no es la vista de nivel más alto en la jerarquía de viewController.
3. De esta manera, el evento se entrega a la vista de nivel más alto en la jerarquía del controlador de vista. Si la vista de nivel más alto no puede manejarlo, el evento se entrega completamente al controlador de vista.
4. viewController intenta manejar el evento. Si no se puede manejar, se pasa a Window. Si no se puede manejar, se pasa a la Aplicación.
5. La aplicación intenta controlar el evento y, si no se puede controlar, lo descarta.
En resumen, cuando una vista no puede manejar un evento, si es la vista de nivel superior y hay un controlador de vista, entonces el evento se pasa al controlador de vista, de lo contrario se pasa a Superview, la supervisión continúa ascendiendo en la jerarquía tratando de manejar eventos.
vista -> ViewController -> ventana -> Aplicación -> descartar
1. Desplácese hacia abajo desde la vista superior entre todas las subvistas (comenzando desde la última en los elementos de la matriz de la subvista adelante), iterando para encontrar el mejor respondedor.
2. Al recorrer para encontrar el mejor respondedor, si una subvista le dice al sistema operativo que no se hizo clic en ella, sus subvistas no se verificarán (similar a la bisección).
3. Cuando la subvista está fuera de los límites de la vista principal y la propiedad clicksToBounds de la vista principal es falsa, la subvista no recibirá eventos.
4. Un objeto UIWindow solo puede tener un objeto de respuesta, que puede ser el primero en responder en un momento dado.
5. Para convertirse en el primer respondedor, debe convertirse en el primer respondedor a través de canBecomeFirstResponder.
6. Cuando configura manualmente una vista como primera respuesta, es posible que la vista no siempre responda inmediatamente cuando ocurre un evento. Por ejemplo, hacer clic en un botón activará su propia respuesta, independientemente de si otra vista se convierte en FirstResponder.
7. FirstResponder se utiliza principalmente cuando ningún respondedor sale a manejar el evento después de que ocurre el evento, y luego el primer respondedor intenta manejar el evento.