Middle
Que se passe-t-il dans le système lorsque nous appuyons sur l'écran?
sobes.tech IA
Réponse de l'IA
Lorsqu'un utilisateur touche l'écran d'un appareil iOS, voici ce qui se passe :
- Capture de l'événement : Le matériel (contrôleur tactile) enregistre le toucher et génère un événement.
- Traitement de l'événement dans IOKit : Le pilote du périphérique dans IOKit reçoit les informations du toucher (coordonnées, force de pression, etc.).
- Envoi de l'événement à SpringBoard : IOKit transmet l'événement au processus système SpringBoard.
- Routage de l'événement : SpringBoard détermine l'application active et envoie l'événement via IPC (Communication Inter-Processus) à cette application.
- Réception de l'événement dans UIKit/SwiftUI : L'application reçoit l'événement via le framework (UIKit ou SwiftUI).
- Ajout de l'événement à la file d'attente : L'événement est ajouté à la file de traitement des événements de l'application.
- Réception de l'événement par l'application : La boucle principale de l'application (Run Loop) extrait l'événement de la file.
- Traitement de l'événement via UIResponder : L'événement est transmis à l'objet
UIEvent. UIKit commence le processus de livraison de l'événement, généralement en commençant par l'objetUIWindow. - Vérification hitTest : Le système détermine la vue
UIView(ou son équivalent en SwiftUI) la plus haute et interactive sous le point de touche, en utilisant la méthodehitTest(_:with:)(en UIKit). Cette méthode parcourt récursivement la hiérarchie des vues, vérifiant si le point est à l'intérieur des limites et si la vue a l'interaction activée. - Livraison de l'événement : L'événement est livré à la vue trouvée. Si la vue ne traite pas l'événement (par exemple, n'a pas de geste correspondant ou implémente
touchesBegan:withEvent:mais ne le gère pas, ou si la méthode retourne nil danshitTest), l'événement est passé au prochain responder dans la chaîne (responder chain), généralement au superview ou au contrôleur de vue. - Traitement des gestes ou méthodes de touche : Si la vue possède des reconnaisseurs de gestes (
UIGestureRecognizer), ils reçoivent l'événement en premier. Si un geste est reconnu, il est traité par une action objc ou une fonction Swift. Si les gestes ne traitent pas l'événement ou s'il n'y en a pas, l'événement est passé aux méthodes de touche de la vue (par exemple,touchesBegan(_:with:),touchesMoved(_:with:),touchesEnded(_:with:),touchesCancelled(_:with:)). - Exécution de la logique : Dans le gestionnaire de geste ou la méthode de touche, la logique personnalisée est exécutée (par exemple, changer l'état de l'UI, la navigation, effectuer une action spécifique).
- Mise à jour de l'UI : Si la logique entraîne des changements dans l'UI, le framework envoie une demande de redessin (si nécessaire).
Voici un exemple de logique très simplifiée pour gérer un toucher sur un bouton :
// Dans la classe ViewController ou un autre UIResponder
@IBAction func buttonTapped(_ sender: Any) {
// Logique exécutée lors du tap sur le bouton
print("Bouton tapé!")
}
Exemple d'utilisation de touchesBegan (moins courant pour des touches simples) :
// Dans une vue personnalisée héritant de UIView
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// Obtenir le premier toucher
guard let touch = touches.first else { return }
// Obtenir la position du toucher dans les coordonnées de la vue
let location = touch.location(in: self)
print("Écran touché à CGPoint : \(location)")
// Si super n'est pas appelé, la suite du traitement dans la chaîne responder sera arrêtée
// super.touchesBegan(touches, with: event)
}