Sobes.tech
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:

  1. Esemény fogadása: A hardver (érintő vezérlő) rögzíti az érintést és eseményt generál.
  2. 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.).
  3. Esemény küldése a SpringBoardnak: Az IOKit továbbítja az eseményt a rendszerfolyamatnak, a SpringBoardnak.
  4. 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.
  5. Esemény fogadása a UIKit/SwiftUI-ben: Az alkalmazásban az eseményt a keretrendszer (UIKit vagy SwiftUI) fogadja.
  6. Esemény hozzáadása a sorhoz: Az eseményt az alkalmazás eseménykezelő sorához adják.
  7. Esemény fogadása az alkalmazás által: Az alkalmazás fő ciklusa (Run Loop) kivonja az eseményt a sorból.
  8. Esemény feldolgozása a UIResponder-en keresztül: Az esemény átadódik a UIEvent objektumnak. A UIKit elindítja az esemény kézbesítési folyamatát, általában a UIWindow objektumtól kezdve.
  9. 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ó, a hitTest(_: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.
  10. 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 a hitTest esetén nil-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.
  11. 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.
  12. 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.
  13. 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)
}