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é:
- Prijatie udalosti: Hardvér (touch kontrolér) zaznamená dotyk a vygeneruje udalosť.
- Spracovanie udalosti v IOKit: Ovládač zariadenia v IOKit dostane informácie o dotyku (súradnice, sila stlačenia atď.).
- Odoslanie udalosti do SpringBoard: IOKit prenesie udalosť systémovému procesu SpringBoard.
- Smerovanie udalosti: SpringBoard určí aktívnu aplikáciu a odošle udalosť cez IPC (Inter-Process Communication) tejto aplikácii.
- Prijatie udalosti v UIKit/SwiftUI: V aplikácii je udalosť prijatá frameworkom (UIKit alebo SwiftUI).
- Pridanie udalosti do fronty: Udalosť sa pridá do fronty na spracovanie udalostí aplikácie.
- Prijatie udalosti aplikáciou: Hlavný cyklus (Run Loop) aplikácie vyberie udalosť z fronty.
- Spracovanie udalosti cez UIResponder: Udalosť sa odovzdá objektu
UIEvent. UIKit začína proces doručenia udalosti, zvyčajne začínajúc odUIWindow. - Kontrola hitTest: Systém určí najvyšší interaktívny
UIView(alebo jeho ekvivalent v SwiftUI), ktorý sa nachádza pod bodom dotyku, pomocou metódyhitTest(_: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. - 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 vracianilprihitTest), udalosť sa prenesie na ďalší responder v reťazci (responder chain), zvyčajne na superview alebo kontrolér pohľadu. - 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:)). - 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).
- 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)
}