Sobes.tech
Middle

Mis juhtub süsteemis, kui me vajutame ekraanile?

sobes.tech AI

Vastus AI-lt

Kui kasutaja puudutab iOS-seadme ekraani, toimub järgmine:

  1. Sündmuse saamine: Seadme riistvara (puutekontroller) registreerib puudutuse ja genereerib sündmuse.
  2. Sündmuse töötlemine IOKit-is: Seadme draiver saab puudutuse teabe (koordinaadid, vajutamise jõud jms).
  3. Sündmuse saatmine SpringBoardile: IOKit edastab sündmuse süsteemprotsessile SpringBoard.
  4. Sündmuse marsruutimine: SpringBoard määrab aktiivse rakenduse ja saadab sündmuse IPC kaudu (inter-process communication) sellele rakendusele.
  5. Sündmuse vastuvõtt UIKit/SwiftUI-s: Rakenduses võetakse sündmus vastu raamistikuga (UIKit või SwiftUI).
  6. Sündmuse lisamine järjekorda: Sündmus lisatakse rakenduse sündmuste töötlemise järjekorda.
  7. Sündmuse vastuvõtt rakenduses: Peamine tsükkel (Run Loop) võtab sündmuse järjekorrast.
  8. Sündmuse töötlemine UIResponderi kaudu: Sündmus edastatakse UIEvent objekti kaudu. UIKit alustab sündmuse edastamise protsessi, tavaliselt alustades UIWindow-st.
  9. hitTest kontroll: Süsteem määrab kõige kõrgema interaktiivse UIView-i (või selle ekvivalendi SwiftUI-s), mis asub puudutuse punktis, kasutades meetodit hitTest(_:with:) (UIKit). See meetod rekursiivselt läbib vaadete hierarhia, kontrollides, kas punkt on boundsi sees ja kas vaade on userInteractionEnabled.
  10. Sündmuse edastamine: Sündmus edastatakse leitud vaadetele. Kui vaade ei töödelda sündmust (näiteks, sellel pole sobivat žesti või see rakendab touchesBegan:withEvent:, kuid ei töödelda seda, või meetod tagastab nil hitTest-i puhul), siis sündmus edastatakse järgmisele responderile ahelas (responder chain), tavaliselt superview'le või vaatekontrollerile.
  11. Žestide või puudutuse meetodite töötlemine: Kui vaadetele on lisatud žestituvastajad (UIGestureRecognizer), saavad nad sündmuse esimesena. Kui žest on tuvastatud, töödeldakse seda vastava objc tegevuse või Swift funktsiooniga. Kui žestid ei töödelda sündmust või neid pole, siis sündmus edastatakse puudutuse meetoditele (touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:)).
  12. Loogika täitmine: Sündmuse töötlemise ajal täidetakse kasutaja loogika (näiteks UI oleku muutmine, navigeerimine, tegevuse täitmine).
  13. UI uuendamine: Kui loogika põhjustab UI muutusi, saadab raamistik uuesti joonistamise taotluse (kui vaja).

Siin on väga lihtne näide puudutuse töötlemise logikast, mis on seotud nupu töötlejaga:

// `ViewController` klassi või muu UIResponder sees
@IBAction func buttonTapped(_ sender: Any) {
    // Loogika, mis täidetakse nupule vajutamisel
    print("Nupp on vajutatud!")
}

Teine näide kasutades touchesBegan (vähem levinud lihtsate vajutuste jaoks):

// Kasutaja loodud vaade, mis pärib UIView-st
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    // Esimese puudutuse saamine
    guard let touch = touches.first else { return }

    // Puudutuse punkt koordinaatides vaates
    let location = touch.location(in: self)

    print("Ekraan puudutatud CGPoint: \(location)")

    // Kui super-i ei kutsuta, siis edasine töötlemine ahelas peatub
    // super.touchesBegan(touches, with: event)
}
"}}}