Middle
Kas notiek sistēmā, kad mēs nospiežam uz ekrāna?
sobes.tech AI
Atbilde no AI
Kad lietotājs nospiež iOS ierīces ekrānu, notiek šādi:
- Notikuma saņemšana: Ierīces aparatūra (touche kontrolieris) reģistrē pieskārienu un ģenerē notikumu.
- Notikuma apstrāde IOKit: Ierīces draiveris saņem pieskāriena informāciju (koordinātes, spiediena spēku utt.).
- Notikuma sūtīšana SpringBoard: IOKit pārsūta notikumu sistēmas procesam SpringBoard.
- Notikuma maršrutēšana: SpringBoard nosaka aktīvo lietotni un sūta notikumu caur IPC (inter-process communication) šai lietotnei.
- Notikuma saņemšana UIKit/SwiftUI: Lietotnē notikums tiek saņemts ar framvorku (UIKit vai SwiftUI).
- Notikuma pievienošana rindai: Notikums tiek pievienots lietotnes notikumu apstrādes rindai.
- Notikuma saņemšana lietotnē: Galvenais cikls (Run Loop) izņem notikumu no rindas.
- Notikuma apstrāde per UIResponder: Notikums tiek nodots
UIEventobjektam. UIKit sāk notikuma piegādes procesu, parasti sākot arUIWindowobjektu. - hitTest pārbaude: Sistēma nosaka augšējo interaktīvo
UIView(vai tā ekvivalentu SwiftUI), kas atrodas zem pieskāriena punkta, izmantojot metodihitTest(_:with:)(UIKit). Šī metode rekursīvi pārbauda skatījumu hierarhiju, pārbaudot, vai punkts ir iekļautsboundsun vai skatījums iruserInteractionEnabled. - Notikuma piegāde: Notikums tiek piegādāts atrastajam skatījumam. Ja skatījums neapstrādā notikumu (piemēram, tam nav atbilstošas žests vai tas īsteno
touchesBegan:withEvent:, bet neapstrādā to, vai metode atgriež nil hitTest gadījumā), tad notikums tiek nodots nākamajam responder'im ķēdē (responder chain), parasti superview vai skatījuma kontrolierim. - Žestu vai pieskāriena metožu apstrāde: Ja skatījumam ir pievienoti žestu atpazīšanas līdzekļi (
UIGestureRecognizer), tie saņem notikumu pirmaji. Ja žests ir atpazīts, tas tiek apstrādāts ar atbilstošuobjcdarbību vai Swift funkciju. Ja žesti neapstrādā notikumu vai to nav, notikums tiek nodots pieskāriena metodēm (touchesBegan(_:with:),touchesMoved(_:with:),touchesEnded(_:with:),touchesCancelled(_:with:)). - Loģikas izpilde: Notikuma apstrādes laikā tiek izpildīta lietotāja loģika (piemēram, UI stāvokļa maiņa, navigācija, darbības izpilde).
- UI atjaunināšana: Ja loģika izraisa izmaiņas UI, framvorks nosūta pārkrāsošanas pieprasījumu (ja nepieciešams).
Šeit ir ļoti vienkāršots pieskāriena apstrādes piemērs, kas saistīts ar pogas apstrādi:
// Klases `ViewController` vai cita UIResponder iekšpusē
@IBAction func buttonTapped(_ sender: Any) {
// Loģika, kas tiek izpildīta, nospiežot pogu
print("Poga nospiesta!")
}
Vēl viens piemērs, izmantojot touchesBegan (mazāk izplatīts vienkāršiem pieskārieniem):
// Lietotāja veidotajā skatījumā, kas manto no UIView
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// Saņem pirmo pieskārienu
guard let touch = touches.first else { return }
// Saņem pieskāriena punktu koordinātos skatījumā
let location = touch.location(in: self)
print("Ekrāns pieskarts CGPoint: \(location)")
// Ja neizsauc super, turpmāka apstrāde ķēdē pārtrauksies
// super.touchesBegan(touches, with: event)
}
"}}} }}}}}} }}}} }}}}