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í:
- Přijetí události: Hardwarové zařízení (touch controller) zaznamená dotyk a vygeneruje událost.
- Zpracování události v IOKit: Ovladač zařízení v IOKit obdrží informace o dotyku (souřadnice, síla stisku atd.).
- Odeslání události do SpringBoard: IOKit předá událost systémovému procesu SpringBoard.
- Směrování události: SpringBoard určí aktivní aplikaci a odešle událost přes IPC (Inter-Process Communication) této aplikaci.
- Přijetí události v UIKit/SwiftUI: V aplikaci je událost přijata frameworkem (UIKit nebo SwiftUI).
- Přidání události do fronty: Událost je přidána do fronty zpracování událostí aplikace.
- Přijetí události aplikací: Hlavní smyčka (Run Loop) aplikace načte událost z fronty.
- 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 objektuUIWindow. - Kontrola hitTest: Systém určí nejvyšší interaktivní
UIView(nebo jeho ekvivalent ve SwiftUI), který se nachází pod bodem dotyku, pomocí metodyhitTest(_:with:)(v UIKit). Tato metoda rekurzivně prochází hierarchii pohledů, kontroluje, zda je bod uvnitř bounds a zda je pohled interaktivní. - 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ínilv případěhitTest), událost je předána dalšímu responderovi v řetězci (responder chain), obvykle superview nebo kontroléru pohledu. - 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říkladtouchesBegan(_:with:),touchesMoved(_:with:),touchesEnded(_:with:),touchesCancelled(_:with:)). - Vykonání logiky: V obsluze gesta nebo metodě dotyku je vykonána uživatelská logika (například změna stavu UI, navigace, provedení akce).
- 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)
}