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:
- Captura del evento: El hardware (touch controller) registra el toque y genera un evento.
- Procesamiento del evento en IOKit: El controlador del dispositivo en IOKit recibe la información del toque (coordenadas, fuerza de presión, etc.).
- Envío del evento a SpringBoard: IOKit transmite el evento al proceso del sistema SpringBoard.
- Enrutamiento del evento: SpringBoard determina la aplicación activa y envía el evento mediante IPC (Inter-Process Communication) a esa aplicación.
- Recepción del evento en UIKit/SwiftUI: La aplicación recibe el evento a través del framework (UIKit o SwiftUI).
- Añadido del evento a la cola: El evento se añade a la cola de procesamiento de eventos de la aplicación.
- Recepción del evento por la aplicación: El ciclo principal de la aplicación (Run Loop) extrae el evento de la cola.
- 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 objetoUIWindow. - 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étodohitTest(_: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. - 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 enhitTest), el evento se pasa al siguiente responder en la cadena (responder chain), generalmente al superview o al controlador de vista. - 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:)). - 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).
- 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)
}