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

  1. Notikuma saņemšana: Ierīces aparatūra (touche kontrolieris) reģistrē pieskārienu un ģenerē notikumu.
  2. Notikuma apstrāde IOKit: Ierīces draiveris saņem pieskāriena informāciju (koordinātes, spiediena spēku utt.).
  3. Notikuma sūtīšana SpringBoard: IOKit pārsūta notikumu sistēmas procesam SpringBoard.
  4. Notikuma maršrutēšana: SpringBoard nosaka aktīvo lietotni un sūta notikumu caur IPC (inter-process communication) šai lietotnei.
  5. Notikuma saņemšana UIKit/SwiftUI: Lietotnē notikums tiek saņemts ar framvorku (UIKit vai SwiftUI).
  6. Notikuma pievienošana rindai: Notikums tiek pievienots lietotnes notikumu apstrādes rindai.
  7. Notikuma saņemšana lietotnē: Galvenais cikls (Run Loop) izņem notikumu no rindas.
  8. Notikuma apstrāde per UIResponder: Notikums tiek nodots UIEvent objektam. UIKit sāk notikuma piegādes procesu, parasti sākot ar UIWindow objektu.
  9. hitTest pārbaude: Sistēma nosaka augšējo interaktīvo UIView (vai tā ekvivalentu SwiftUI), kas atrodas zem pieskāriena punkta, izmantojot metodi hitTest(_:with:) (UIKit). Šī metode rekursīvi pārbauda skatījumu hierarhiju, pārbaudot, vai punkts ir iekļauts bounds un vai skatījums ir userInteractionEnabled.
  10. 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.
  11. Ž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šu objc darbī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:)).
  12. 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).
  13. 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)
}
"}}} }}}}}} }}}} }}}}