Sobes.tech
Middle

Ce se întâmplă în sistem când apăsăm pe ecran?

sobes.tech AI

Răspuns de la AI

Când utilizatorul atinge ecranul unui dispozitiv iOS, se întâmplă următoarele:

  1. Captarea evenimentului: Hardware-ul (controlerul de atingere) înregistrează atingerea și generează un eveniment.
  2. Procesarea evenimentului în IOKit: Driver-ul dispozitivului în IOKit primește informațiile despre atingere (coordonate, forța de apăsare etc.).
  3. Trimiterea evenimentului către SpringBoard: IOKit transmite evenimentul către procesul sistemului SpringBoard.
  4. Routing-ul evenimentului: SpringBoard determină aplicația activă și trimite evenimentul prin IPC (Inter-Process Communication) către acea aplicație.
  5. Primirea evenimentului în UIKit/SwiftUI: Aplicația primește evenimentul prin intermediul framework-ului (UIKit sau SwiftUI).
  6. Adăugarea evenimentului în coadă: Evenimentul este adăugat în coada de procesare a evenimentelor a aplicației.
  7. Primirea evenimentului de către aplicație: Bucla principală a aplicației (Run Loop) extrage evenimentul din coadă.
  8. Procesarea evenimentului prin UIResponder: Evenimentul este transmis obiectului UIEvent. UIKit inițiază procesul de livrare a evenimentului, de obicei începând cu UIWindow.
  9. Verificarea hitTest: Sistemul determină UIView-ul (sau echivalentul său în SwiftUI) cel mai de sus și interactiv sub punctul de atingere, folosind metoda hitTest(_:with:). Această metodă parcurge recursiv ierarhia de vizualizări, verificând dacă punctul se află în interiorul limitelor și dacă vizualizarea are userInteractionEnabled activat.
  10. Livrarea evenimentului: Evenimentul este livrat vizualizării găsite. Dacă vizualizarea nu procesează evenimentul (de exemplu, nu are un gest corespunzător sau implementează touchesBegan:withEvent: dar nu îl gestionează, sau dacă metoda returnează nil în hitTest), evenimentul este trecut la următorul responder din lanțul de răspuns (responder chain), de obicei supervizorul sau controlerul de vizualizare.
  11. Procesarea gesturilor sau a metodelor de atingere: Dacă vizualizarea are recunoașteri de gesturi (UIGestureRecognizer), acestea primesc evenimentul primele. Dacă un gest este recunoscut, acesta este gestionat printr-o acțiune objc sau funcție Swift. Dacă gesturile nu procesează evenimentul sau nu există, evenimentul este trecut la metodele de atingere ale vizualizării (de exemplu, touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)).
  12. Executarea logicii: În handler-ul de gest sau metodă de atingere, se execută logica personalizată (de exemplu, schimbarea stării UI, navigare, executarea unei acțiuni).
  13. Actualizarea UI: Dacă logica duce la modificări în UI, framework-ul trimite o solicitare de redesenare (dacă este necesar).

Iată un exemplu de logică foarte simplificată pentru gestionarea atingerii pe un buton:

// În interiorul clasei ViewController sau alt UIResponder
@IBAction func buttonTapped(_ sender: Any) {
    // Logica executată la apăsarea butonului
    print("Buton apăsat!")
}

Exemplu de utilizare a touchesBegan (mai puțin frecvent pentru atingeri simple):

// Într-o vizualizare personalizată care moștenește din UIView
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    // Obținerea primului atingere
    guard let touch = touches.first else { return }

    // Obținerea punctului de atingere în coordonatele vizualizării
    let location = touch.location(in: self)

    print("Ecran atins la CGPoint: \(location)")

    // Dacă nu se apelează super, procesarea ulterioară în lanțul responder-ilor se va opri
    // super.touchesBegan(touches, with: event)
}