Sobes.tech
Middle

Čo sa deje v systéme, keď klikneme na obrazovku?

sobes.tech AI

Odpoveď od AI

Keď používateľ klepne na obrazovku zariadenia iOS, stane sa nasledovné:

  1. Prijatie udalosti: Hardvér (touch kontrolér) zaznamená dotyk a vygeneruje udalosť.
  2. Spracovanie udalosti v IOKit: Ovládač zariadenia v IOKit dostane informácie o dotyku (súradnice, sila stlačenia atď.).
  3. Odoslanie udalosti do SpringBoard: IOKit prenesie udalosť systémovému procesu SpringBoard.
  4. Smerovanie udalosti: SpringBoard určí aktívnu aplikáciu a odošle udalosť cez IPC (Inter-Process Communication) tejto aplikácii.
  5. Prijatie udalosti v UIKit/SwiftUI: V aplikácii je udalosť prijatá frameworkom (UIKit alebo SwiftUI).
  6. Pridanie udalosti do fronty: Udalosť sa pridá do fronty na spracovanie udalostí aplikácie.
  7. Prijatie udalosti aplikáciou: Hlavný cyklus (Run Loop) aplikácie vyberie udalosť z fronty.
  8. Spracovanie udalosti cez UIResponder: Udalosť sa odovzdá objektu UIEvent. UIKit začína proces doručenia udalosti, zvyčajne začínajúc od UIWindow.
  9. Kontrola hitTest: Systém určí najvyšší interaktívny UIView (alebo jeho ekvivalent v SwiftUI), ktorý sa nachádza pod bodom dotyku, pomocou metódy hitTest(_:with:) (v UIKit). Táto metóda rekurzívne prechádza hierarchiu pohľadov, kontroluje, či je bod vo vnútri bounds a či je pohľad interaktívny.
  10. Doručenie udalosti: Udalosť sa doručí nájdenému pohľadu. Ak pohľad neobsluhuje udalosť (napríklad, nemá vhodný gest alebo implementuje touchesBegan:withEvent: ale neobsluhuje ju, alebo ak metóda vracia nil pri hitTest), udalosť sa prenesie na ďalší responder v reťazci (responder chain), zvyčajne na superview alebo kontrolér pohľadu.
  11. Spracovanie gest alebo metód dotyku: Ak má pohľad pripojené rozpoznávače gest (UIGestureRecognizer), tie dostanú udalosť ako prvé. Ak je gesto rozpoznané, je spracované príslušnou akciou v Objective-C alebo Swift. Ak gestá neobsluhujú udalosť alebo chýbajú, udalosť sa prenesie na metódy dotyku pohľadu (napríklad, touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)).
  12. Vykonanie logiky: V obsluhe gesta alebo metóde dotyku sa vykonáva používateľská logika (napríklad, zmena stavu UI, navigácia, vykonanie akcie).
  13. Aktualizácia UI: Ak logika spôsobí zmeny v UI, framework odošle požiadavku na prekreslenie (ak je potrebné).

Tu je príklad veľmi zjednodušenej logiky spracovania dotyku v obsluhe tlačidla:

// Vo vnútri triedy ViewController alebo iného UIResponder
@IBAction func buttonTapped(_ sender: Any) {
    // Logika, ktorá sa vykonáva pri stlačení tlačidla
    print("Tlačidlo stlačené!")
}

Príklad použitia touchesBegan (menej rozšírené pre jednoduché stlačenia):

// V používateľskom pohľade, ktorý dedí od UIView
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first else { return }
    let location = touch.location(in: self)
    print("Obrazovka bola dotknutá CGPoint: \(location)")
    // Ak nezavoláte super, ďalšie spracovanie v reťazci responderov sa ukončí
    // super.touchesBegan(touches, with: event)
}