Middle
Mi történik a rendszerben, amikor megnyomjuk a képernyőt?
sobes.tech MI
Válasz az MI-től
Amikor a felhasználó megérinti az iOS-eszköz képernyőjét, a következő történik:
- Esemény fogadása: A hardver (érintő vezérlő) rögzíti az érintést és eseményt generál.
- Esemény feldolgozása az IOKit-ben: Az eszközillesztő az IOKit-ben megkapja az érintés adatait (koordináták, nyomás erőssége stb.).
- Esemény küldése a SpringBoardnak: Az IOKit továbbítja az eseményt a rendszerfolyamatnak, a SpringBoardnak.
- Esemény útvonalának meghatározása: A SpringBoard meghatározza az aktív alkalmazást és IPC-n keresztül (Inter-Process Communication) elküldi neki az eseményt.
- Esemény fogadása a UIKit/SwiftUI-ben: Az alkalmazásban az eseményt a keretrendszer (UIKit vagy SwiftUI) fogadja.
- Esemény hozzáadása a sorhoz: Az eseményt az alkalmazás eseménykezelő sorához adják.
- Esemény fogadása az alkalmazás által: Az alkalmazás fő ciklusa (Run Loop) kivonja az eseményt a sorból.
- Esemény feldolgozása a UIResponder-en keresztül: Az esemény átadódik a
UIEventobjektumnak. A UIKit elindítja az esemény kézbesítési folyamatát, általában aUIWindowobjektumtól kezdve. - hitTest ellenőrzése: A rendszer meghatározza a legfelső interaktív
UIView-t (vagy annak megfelelőjét SwiftUI-ben), amely a érintési pont alatt található, ahitTest(_:with:)módszerrel (UIKit-ben). Ez a módszer rekurzívan végigjárja a nézet hierarchiát, ellenőrizve, hogy a pont a határokon belül van-e, és az adott nézet interakcióképes-e. - Esemény kézbesítése: Az esemény a megtalált nézethez kerül. Ha a nézet nem kezeli az eseményt (pl. nincs megfelelő gesztus, vagy a
touchesBegan:withEvent:-et implementálja, de nem kezeli, vagy ahitTesteseténnil-t ad vissza), akkor az esemény a következő responder-hez kerül a láncban (responder chain), általában a szülő nézethez vagy a nézet kontrollerhez. - Gesztusok vagy érintéses metódusok kezelése: Ha a nézethez kapcsolódó
UIGestureRecognizer-ok vannak, azok kapják meg elsőként az eseményt. Ha a gesztus felismerésre kerül, az a megfelelő Objective-C vagy Swift művelettel vagy funkcióval kerül feldolgozásra. Ha a gesztusok nem kezelik az eseményt, vagy hiányoznak, akkor az esemény a nézet érintéses metódusaira (pl.touchesBegan(_:with:),touchesMoved(_:with:),touchesEnded(_:with:),touchesCancelled(_:with:)) kerül továbbításra. - Logika végrehajtása: A gesztus vagy érintés kezelőben a felhasználói logika (pl. UI állapot változtatása, navigáció, művelet végrehajtása) kerül végrehajtásra.
- UI frissítése: Ha a logika UI változásokhoz vezet, a keretrendszer kérésként küldi el az újrarajzolást (ha szükséges).
Íme egy nagyon egyszerű érintéskezelő logika példája egy gomb kezelőjében:
// A ViewController vagy más UIResponder osztályban
@IBAction func buttonTapped(_ sender: Any) {
// A logika, ami a gomb megnyomásakor fut
print("Gomb megnyomva!")
}
A touchesBegan használatának példája (kevésbé elterjedt egyszerű érintésekhez):
// Egy UIView-ből öröklődő egyéni nézetben
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let location = touch.location(in: self)
print("Képernyő érintve CGPoint: \(location)")
// Ha nem hívja meg a super-t, az esemény lánc további feldolgozása megszűnik
// super.touchesBegan(touches, with: event)
}