Middle
Mis juhtub süsteemis, kui me vajutame ekraanile?
sobes.tech AI
Vastus AI-lt
Kui kasutaja puudutab iOS-seadme ekraani, toimub järgmine:
- Sündmuse saamine: Seadme riistvara (puutekontroller) registreerib puudutuse ja genereerib sündmuse.
- Sündmuse töötlemine IOKit-is: Seadme draiver saab puudutuse teabe (koordinaadid, vajutamise jõud jms).
- Sündmuse saatmine SpringBoardile: IOKit edastab sündmuse süsteemprotsessile SpringBoard.
- Sündmuse marsruutimine: SpringBoard määrab aktiivse rakenduse ja saadab sündmuse IPC kaudu (inter-process communication) sellele rakendusele.
- Sündmuse vastuvõtt UIKit/SwiftUI-s: Rakenduses võetakse sündmus vastu raamistikuga (UIKit või SwiftUI).
- Sündmuse lisamine järjekorda: Sündmus lisatakse rakenduse sündmuste töötlemise järjekorda.
- Sündmuse vastuvõtt rakenduses: Peamine tsükkel (Run Loop) võtab sündmuse järjekorrast.
- Sündmuse töötlemine UIResponderi kaudu: Sündmus edastatakse
UIEventobjekti kaudu. UIKit alustab sündmuse edastamise protsessi, tavaliselt alustadesUIWindow-st. - hitTest kontroll: Süsteem määrab kõige kõrgema interaktiivse
UIView-i (või selle ekvivalendi SwiftUI-s), mis asub puudutuse punktis, kasutades meetodithitTest(_:with:)(UIKit). See meetod rekursiivselt läbib vaadete hierarhia, kontrollides, kas punkt on boundsi sees ja kas vaade onuserInteractionEnabled. - 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. - Ž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 vastavaobjctegevuse 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:)). - Loogika täitmine: Sündmuse töötlemise ajal täidetakse kasutaja loogika (näiteks UI oleku muutmine, navigeerimine, tegevuse täitmine).
- 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)
}
"}}}