Middle
Co się dzieje w systemie, gdy naciskamy ekran?
sobes.tech AI
Odpowiedź od AI
Gdy użytkownik dotyka ekranu urządzenia iOS, dzieje się następująco:
- Rejestrowanie zdarzenia: Sprzęt (kontroler dotyku) rejestruje dotknięcie i generuje zdarzenie.
- Przetwarzanie zdarzenia w IOKit: Sterownik urządzenia w IOKit otrzymuje informacje o dotknięciu (współrzędne, siła nacisku itp.).
- Wysyłanie zdarzenia do SpringBoard: IOKit przekazuje zdarzenie do procesu systemowego SpringBoard.
- Routing zdarzenia: SpringBoard określa aktywną aplikację i wysyła zdarzenie przez IPC (Inter-Process Communication) do tej aplikacji.
- Odbiór zdarzenia w UIKit/SwiftUI: Aplikacja odbiera zdarzenie za pomocą frameworka (UIKit lub SwiftUI).
- Dodanie zdarzenia do kolejki: Zdarzenie jest dodawane do kolejki obsługi zdarzeń aplikacji.
- Odbiór zdarzenia przez aplikację: Główna pętla aplikacji (Run Loop) pobiera zdarzenie z kolejki.
- Przetwarzanie zdarzenia przez UIResponder: Zdarzenie jest przekazywane do obiektu
UIEvent. UIKit rozpoczyna proces dostarczania zdarzenia, zwykle zaczynając odUIWindow. - Weryfikacja hitTest: System określa najbardziej górną i interaktywną
UIView(lub jej odpowiednik w SwiftUI), która znajduje się pod punktem dotyku, używając metodyhitTest(_:with:). Ta metoda rekurencyjnie przechodzi przez hierarchię widoków, sprawdzając, czy punkt mieści się w granicach i czy widok ma włączoną interakcję. - Dostarczenie zdarzenia: Zdarzenie jest dostarczane do znalezionego widoku. Jeśli widok nie obsługuje zdarzenia (np. nie ma odpowiedniego gestu lub implementuje
touchesBegan:withEvent:, ale go nie obsługuje, lub jeśli metoda zwraca nil whitTest), zdarzenie jest przekazywane do następnego respondera w łańcuchu (responder chain), zwykle do superview lub kontrolera widoku. - Obsługa gestów lub metod dotyku: Jeśli widok ma rozpoznawacze gestów (
UIGestureRecognizer), otrzymują one zdarzenie jako pierwsze. Jeśli gest zostanie rozpoznany, obsługiwany jest przez odpowiednią akcję objc lub funkcję Swift. Jeśli gesty nie obsługują zdarzenia lub ich nie ma, zdarzenie jest przekazywane do metod dotyku widoku (np.touchesBegan(_:with:),touchesMoved(_:with:),touchesEnded(_:with:),touchesCancelled(_:with:)). - Wykonanie logiki: W obsłudze gestu lub metodzie dotyku wykonywana jest niestandardowa logika (np. zmiana stanu UI, nawigacja, wykonanie akcji).
- Aktualizacja UI: Jeśli logika powoduje zmiany w UI, framework wysyła żądanie ponownego rysowania (jeśli konieczne).
Oto przykład bardzo uproszczonej logiki obsługi dotyku w obsłudze przycisku:
// Wewnątrz klasy ViewController lub innego UIResponder
@IBAction func buttonTapped(_ sender: Any) {
// Logika wykonywana po naciśnięciu przycisku
print("Przycisk naciśnięty!")
}
Przykład użycia touchesBegan (mniej powszechny dla prostych dotknięć):
// W niestandardowym widoku dziedziczącym po UIView
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// Pobranie pierwszego dotknięcia
guard let touch = touches.first else { return }
// Pobranie punktu dotknięcia w współrzędnych widoku
let location = touch.location(in: self)
print("Ekran dotknięty w CGPoint: \(location)")
// Jeśli nie wywoła się super, dalsze przetwarzanie w łańcuchu responderów zostanie zatrzymane
// super.touchesBegan(touches, with: event)
}