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:
- Įvykio gavimas: Aparatūra (liesti valdiklis) užregistruoja prisilietimą ir generuoja įvykį.
- Įvykio apdorojimas IOKit: Įrenginio tvarkyklė gauna prisilietimo informaciją (koordinatės, spaudimo jėga ir kt.).
- Įvykio siuntimas SpringBoard: IOKit perduoda įvykį sisteminiam procesui SpringBoard.
- Įvykio maršrutizavimas: SpringBoard nustato aktyvią programą ir siunčia įvykį per IPC (inter-process communication) šiai programai.
- Įvykio priėmimas UIKit/SwiftUI: Programoje įvykis priimamas per framwork'ą (UIKit arba SwiftUI).
- Įvykio pridėjimas į eilę: Įvykis pridedamas į programos įvykių apdorojimo eilę.
- Įvykio gavimas programoje: Pagrindinis ciklas (Run Loop) ištraukia įvykį iš eilės.
- Įvykio apdorojimas per UIResponder: Įvykis perduodamas
UIEventobjektui. UIKit pradeda įvykio pristatymo procesą, dažniausiai pradedantUIWindowobjektu. - 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 vidujeboundsir ar vaizdas turiuserInteractionEnabled. - Į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. - Gesto ar prisilietimo metodų apdorojimas: Jei vaizdas turi pririštus gestų atpažintojus (
UIGestureRecognizer), jie gauna įvykį pirmieji. Jei gestas atpažįstamas, jis apdorojamas atitinkamuobjcveiksmu arba Swift funkcija. Jei gestai neapdoroja įvykio arba jų nėra, įvykis perduodamas prisilietimo metodams (touchesBegan(_:with:),touchesMoved(_:with:),touchesEnded(_:with:),touchesCancelled(_:with:)). - Logikos vykdymas: Priešingai, įvykio apdorojimo metu vykdomas vartotojo logika (pavyzdžiui, UI būsenos keitimas, navigacija, veiksmų vykdymas).
- 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)
}
"}}}}}}}}}}}}}}}}}}}}}}}}}'}