Sobes.tech
Middle

Co se děje v systému, když klikneme na obrazovku?

sobes.tech AI

Odpověď od AI

Když uživatel klepne na obrazovku zařízení iOS, stane se následující:

  1. Přijetí události: Hardwarové zařízení (touch controller) zaznamená dotyk a vygeneruje událost.
  2. Zpracování události v IOKit: Ovladač zařízení v IOKit obdrží informace o dotyku (souřadnice, síla stisku atd.).
  3. Odeslání události do SpringBoard: IOKit předá událost systémovému procesu SpringBoard.
  4. Směrování události: SpringBoard určí aktivní aplikaci a odešle událost přes IPC (Inter-Process Communication) této aplikaci.
  5. Přijetí události v UIKit/SwiftUI: V aplikaci je událost přijata frameworkem (UIKit nebo SwiftUI).
  6. Přidání události do fronty: Událost je přidána do fronty zpracování událostí aplikace.
  7. Přijetí události aplikací: Hlavní smyčka (Run Loop) aplikace načte událost z fronty.
  8. Zpracování události přes UIResponder: Událost je předána objektu UIEvent. UIKit zahájí proces doručení události, obvykle začínající od objektu UIWindow.
  9. Kontrola hitTest: Systém určí nejvyšší interaktivní UIView (nebo jeho ekvivalent ve SwiftUI), který se nachází pod bodem dotyku, pomocí metody hitTest(_:with:) (v UIKit). Tato metoda rekurzivně prochází hierarchii pohledů, kontroluje, zda je bod uvnitř bounds a zda je pohled interaktivní.
  10. Doručení události: Událost je doručena nalezenému pohledu. Pokud pohled událost nezpracovává (například nemá odpovídající gesto nebo implementuje touchesBegan:withEvent: ale nezpracovává ji, nebo pokud metoda vrací nil v případě hitTest), událost je předána dalšímu responderovi v řetězci (responder chain), obvykle superview nebo kontroléru pohledu.
  11. Zpracování gest nebo metod dotyku: Pokud má pohled připojené rozpoznávače gest (UIGestureRecognizer), ty obdrží událost jako první. Pokud je gesto rozpoznáno, je zpracováno odpovídající akcí v Objective-C nebo Swift. Pokud gesta neřeší událost nebo chybí, událost je předána metodám dotyku pohledu (například touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)).
  12. Vykonání logiky: V obsluze gesta nebo metodě dotyku je vykonána uživatelská logika (například změna stavu UI, navigace, provedení akce).
  13. Aktualizace UI: Pokud logika vede ke změnám v UI, framework odešle požadavek na překreslení (je-li potřeba).

Zde je příklad velmi zjednodušené logiky zpracování dotyku v obsluze tlačítka:

// Uvnitř třídy ViewController nebo jiného UIResponder
@IBAction func buttonTapped(_ sender: Any) {
    // Logika, která se provádí při stisknutí tlačítka
    print("Tlačítko stisknuto!")
}

Příklad použití touchesBegan (méně běžný pro jednoduché stisky):

// V uživatelském pohledu dědícím z 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 byla dotčena CGPoint: \(location)")
    // Pokud nezavoláte super, další zpracování v řetězci responderů přestane
    // super.touchesBegan(touches, with: event)
}