Sobes.tech
Middle

Kas vyksta sistemoje, kai mes paspaudžiame ekraną?

sobes.tech AI

Atsakymas iš AI

Kai naudotojas paspaudžia iOS įrenginio ekraną, vyksta šie veiksmai:

  1. Įvykio gavimas: Aparatūra (liesti valdiklis) užregistruoja prisilietimą ir generuoja įvykį.
  2. Įvykio apdorojimas IOKit: Įrenginio tvarkyklė gauna prisilietimo informaciją (koordinatės, spaudimo jėga ir kt.).
  3. Įvykio siuntimas SpringBoard: IOKit perduoda įvykį sisteminiam procesui SpringBoard.
  4. Įvykio maršrutizavimas: SpringBoard nustato aktyvią programą ir siunčia įvykį per IPC (inter-process communication) šiai programai.
  5. Įvykio priėmimas UIKit/SwiftUI: Programoje įvykis priimamas per framwork'ą (UIKit arba SwiftUI).
  6. Įvykio pridėjimas į eilę: Įvykis pridedamas į programos įvykių apdorojimo eilę.
  7. Įvykio gavimas programoje: Pagrindinis ciklas (Run Loop) ištraukia įvykį iš eilės.
  8. Įvykio apdorojimas per UIResponder: Įvykis perduodamas UIEvent objektui. UIKit pradeda įvykio pristatymo procesą, dažniausiai pradedant UIWindow objektu.
  9. hitTest patikrinimas: Sistema nustato aukščiausią interaktyvų UIView (ar jo ekvivalentą SwiftUI), kuris yra po prisilietimo taško, naudojant metodą hitTest(_:with:) (UIKit). Šis metodas rekursyviai pereina per vaizdų hierarchiją, tikrindamas, ar taškas yra viduje bounds ir ar vaizdas turi userInteractionEnabled.
  10. Įvykio pristatymas: Įvykis perduodamas rastam vaizdui. Jei vaizdas neapdoroja įvykio (pavyzdžiui, neturi atitinkamo gesto arba įgyvendina touchesBegan:withEvent:, bet jo neapdoroja, arba jei metodas grąžina nil hitTest atveju), tada įvykis perduodamas kitam responder'ui grandinėje (responder chain), dažniausiai superview arba vaizdo valdikliui.
  11. Gesto ar prisilietimo metodų apdorojimas: Jei vaizdas turi pririštus gestų atpažintojus (UIGestureRecognizer), jie gauna įvykį pirmieji. Jei gestas atpažįstamas, jis apdorojamas atitinkamu objc veiksmu arba Swift funkcija. Jei gestai neapdoroja įvykio arba jų nėra, įvykis perduodamas prisilietimo metodams (touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)).
  12. Logikos vykdymas: Priešingai, įvykio apdorojimo metu vykdomas vartotojo logika (pavyzdžiui, UI būsenos keitimas, navigacija, veiksmų vykdymas).
  13. UI atnaujinimas: Jei logika sukelia UI pakeitimus, framwork'as siunčia perrašymo užklausą (jei reikia).

Štai labai supaprastintas prisilietimo apdorojimo pavyzdys, susijęs su mygtuko apdorojimu:

// `ViewController` klasėje arba kitame UIResponder
@IBAction func buttonTapped(_ sender: Any) {
    // Logika, vykdoma paspaudus mygtuką
    print("Mygtukas paspaustas!")
}

Kitas pavyzdys naudojant touchesBegan (mažiau paplitęs paprastiems paspaudimams):

// Naudotojo sukurtame vaizde, kuris paveldi iš UIView
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    // Gauti pirmą prisilietimą
    guard let touch = touches.first else { return }

    // Gauti prisilietimo tašką vaizdo koordinačiuose
    let location = touch.location(in: self)

    print("Ekranas paliestas CGPoint: \(location)")

    // Jei nepaminės super, tolesnė apdorojimas grandinėje sustos
    // super.touchesBegan(touches, with: event)
}
"}}}}}}}}}}}}}}}}}}}}}}}}}'}