Sobes.tech
Middle

¿Qué sucede en el sistema cuando pulsamos en la pantalla?

sobes.tech AI

Respuesta de la IA

Cuando un usuario toca la pantalla de un dispositivo iOS, sucede lo siguiente:

  1. Captura del evento: El hardware (touch controller) registra el toque y genera un evento.
  2. Procesamiento del evento en IOKit: El controlador del dispositivo en IOKit recibe la información del toque (coordenadas, fuerza de presión, etc.).
  3. Envío del evento a SpringBoard: IOKit transmite el evento al proceso del sistema SpringBoard.
  4. Enrutamiento del evento: SpringBoard determina la aplicación activa y envía el evento mediante IPC (Inter-Process Communication) a esa aplicación.
  5. Recepción del evento en UIKit/SwiftUI: La aplicación recibe el evento a través del framework (UIKit o SwiftUI).
  6. Añadido del evento a la cola: El evento se añade a la cola de procesamiento de eventos de la aplicación.
  7. Recepción del evento por la aplicación: El ciclo principal de la aplicación (Run Loop) extrae el evento de la cola.
  8. Procesamiento del evento a través de UIResponder: El evento se pasa al objeto UIEvent. UIKit inicia el proceso de entrega del evento, generalmente comenzando por el objeto UIWindow.
  9. Verificación hitTest: El sistema determina la vista UIView (o su equivalente en SwiftUI) más superior e interactiva que está debajo del punto de toque, usando el método hitTest(_:with:) (en UIKit). Este método recorre recursivamente la jerarquía de vistas, verificando si el punto está dentro de los límites y si la vista tiene habilitada la interacción.
  10. Entrega del evento: El evento se entrega a la vista encontrada. Si la vista no procesa el evento (por ejemplo, no tiene un gesto correspondiente o implementa touchesBegan:withEvent: pero no lo maneja, o si el método devuelve nil en hitTest), el evento se pasa al siguiente responder en la cadena (responder chain), generalmente al superview o al controlador de vista.
  11. Procesamiento de gestos o métodos de toque: Si la vista tiene reconocedores de gestos (UIGestureRecognizer), estos reciben el evento primero. Si se reconoce un gesto, se maneja mediante una acción objc o función Swift. Si los gestos no manejan el evento o no hay ninguno, el evento se pasa a los métodos de toque de la vista (por ejemplo, touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)).
  12. Ejecución de la lógica: En el manejador de gestos o método de toque, se realiza la lógica personalizada (por ejemplo, cambiar el estado de la UI, navegación, acción específica).
  13. Actualización de la UI: Si la lógica provoca cambios en la UI, el framework envía una solicitud de redibujo (si es necesario).

Aquí un ejemplo de lógica muy simplificada para manejar un toque en un botón:

// Dentro de la clase ViewController u otro UIResponder
@IBAction func buttonTapped(_ sender: Any) {
    // Lógica que se ejecuta al pulsar el botón
    print("¡Botón pulsado!")
}

Ejemplo de uso de touchesBegan (menos común para toques simples):

// En una vista personalizada que hereda de UIView
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    // Obtener el primer toque
    guard let touch = touches.first else { return }

    // Obtener la ubicación del toque en las coordenadas de la vista
    let location = touch.location(in: self)

    print("Pantalla tocada en CGPoint: \(location)")

    // Si no se llama a super, la continuación del procesamiento en la cadena responder se detendrá
    // super.touchesBegan(touches, with: event)
}