Sobes.tech
Middle

Τι συμβαίνει στο σύστημα όταν πατάμε στην οθόνη;

sobes.tech AI

Απάντηση από AI

Όταν ο χρήστης πατάει στην οθόνη μιας συσκευής iOS, συμβαίνουν τα εξής:

  1. Λήψη συμβάντος: Το υλικό (touch controller) καταγράφει την αφή και δημιουργεί ένα συμβάν.
  2. Επεξεργασία συμβάντος στο IOKit: Ο οδηγός συσκευής στο IOKit λαμβάνει πληροφορίες σχετικά με την αφή (συντεταγμένες, δύναμη πίεσης κ.λπ.).
  3. Αποστολή συμβάντος στο SpringBoard: Το IOKit μεταφέρει το συμβάν στη συστημική διαδικασία SpringBoard.
  4. Διαδρομολόγηση συμβάντος: Το SpringBoard καθορίζει την ενεργή εφαρμογή και στέλνει το συμβάν μέσω IPC (Inter-Process Communication) σε αυτήν.
  5. Αποδοχή συμβάντος στο UIKit/SwiftUI: Στην εφαρμογή, το συμβάν λαμβάνεται από το framework (UIKit ή SwiftUI).
  6. Προσθήκη συμβάντος στην ουρά: Το συμβάν προστίθεται στην ουρά επεξεργασίας συμβάντων της εφαρμογής.
  7. Λήψη συμβάντος από την εφαρμογή: Ο κύκλος λειτουργίας (Run Loop) της εφαρμογής αντλεί το συμβάν από την ουρά.
  8. Επεξεργασία συμβάντος μέσω UIResponder: Το συμβάν μεταβιβάζεται στο αντικείμενο UIEvent. Το UIKit ξεκινά τη διαδικασία παράδοσης του συμβάντος, ξεκινώντας συνήθως από το αντικείμενο UIWindow.
  9. Έλεγχος hitTest: Το σύστημα καθορίζει το ανώτερο διαδραστικό UIView (ή το αντίστοιχο του στο SwiftUI) που βρίσκεται κάτω από το σημείο της αφήγησης, χρησιμοποιώντας τη μέθοδο hitTest(_:with:) (στο UIKit). Αυτή η μέθοδος διατρέχει αναδρομικά τη ιεραρχία των εμφανίσεων, ελέγχοντας αν το σημείο βρίσκεται εντός των ορίων και αν η εμφάνιση έχει ενεργή αλληλεπίδραση.
  10. Παράδοση συμβάντος: Το συμβάν παραδίδεται στην εύρεση εμφάνιση. Αν η εμφάνιση δεν επεξεργάζεται το συμβάν (π.χ., δεν έχει κατάλληλο gesture ή υλοποιεί touchesBegan:withEvent: αλλά δεν το επεξεργάζεται, ή αν η μέθοδος επιστρέφει nil στο hitTest), το συμβάν περνάει στον επόμενο responder στην αλυσίδα (responder chain), συνήθως στον superview ή στον ελεγκτή εμφάνισης.
  11. Επεξεργασία gestures ή μεθόδων αφής: Αν η εμφάνιση έχει συνδεδεμένους αναγνωριστές gestures (UIGestureRecognizer), αυτοί λαμβάνουν το συμβάν πρώτοι. Αν το gesture αναγνωριστεί, επεξεργάζεται με την αντίστοιχη ενέργεια Objective-C ή Swift. Αν τα gestures δεν επεξεργάζονται το συμβάν ή απουσιάζουν, το συμβάν περνά στις μεθόδους αφής της εμφάνισης (π.χ., touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)).
  12. Εκτέλεση λογικής: Στον χειρισμό gesture ή μέθοδο αφής, εκτελείται η προσαρμοσμένη λογική χρήστη (π.χ., αλλαγή κατάστασης UI, πλοήγηση, εκτέλεση ενέργειας).
  13. Ενημέρωση UI: Αν η λογική προκαλεί αλλαγές στο UI, το framework στέλνει αίτημα για ανανέωση (εάν χρειάζεται).

Ακολουθεί ένα παράδειγμα πολύ απλής λογικής επεξεργασίας αφήγησης σε χειριστή κουμπιού:

// Μέσα σε κλάση ViewController ή άλλο UIResponder
@IBAction func buttonTapped(_ sender: Any) {
    // Λογική που εκτελείται κατά το πάτημα του κουμπιού
    print("Το κουμπί πατήθηκε!")
}

Παράδειγμα χρήσης touchesBegan (λιγότερο συνηθισμένο για απλά πάτηματα):

// Στο προσαρμοσμένο view που κληρονομεί από UIView
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first else { return }
    let location = touch.location(in: self)
    print("Η οθόνη touched CGPoint: \(location)")
    // Αν δεν καλέσετε το super, η περαιτέρω επεξεργασία στην αλυσίδα responder θα διακοπεί
    // super.touchesBegan(touches, with: event)
}