Middle
Ekrana toxunduqda sistemdə nə baş verir?
sobes.tech Süni İntellekt
AI-dan cavab
İstifadəçi iOS cihazının ekranına toxunduqda, aşağıdakı baş verir:
- Hadisənin alınması: Hardware (tac-kontrolör) toxunuşu qeyd edir və hadisə yaradır.
- IOKit-də hadisənin işlənməsi: Cihaz sürücüsü IOKit-də toxunuş haqqında məlumat alır (koordinatlar, basma gücü və s.).
- SpringBoard-ə hadisənin göndərilməsi: IOKit hadisəni sistem prosesi olan SpringBoard-a ötürür.
- Hadisənin marşrutlaşdırılması: SpringBoard aktiv tətbiqi müəyyən edir və hadisəni IPC (Inter-Process Communication) vasitəsilə həmin tətbiqə göndərir.
- UIKit/SwiftUI-də hadisənin qəbul edilməsi: Tətbiqdə hadisə framework (UIKit və ya SwiftUI) tərəfindən qəbul edilir.
- Hadisənin növbəyə əlavə edilməsi: Hadisə tətbiqin hadisə işləmə növbəsinə əlavə olunur.
- Tətbiq tərəfindən hadisənin alınması: Əsas dövr (Run Loop) növbədən hadisəni çıxarır.
- UIResponder vasitəsilə hadisənin işlənməsi: Hadisə
UIEventobyektinə ötürülür. UIKit hadisənin çatdırılma prosesinə başlayır, adətənUIWindowobyektindən başlayır. - hitTest yoxlaması: Sistem ən yuxarı interaktiv
UIView(və ya SwiftUI-də onun ekvivalenti) müəyyən edir, toxunuş nöqtəsinin altında yerləşir vəhitTest(_:with:)metodu ilə yoxlanır (UIKit-də). Bu metod rekursiv olaraq görünüşlər hierarxiyasını keçərək, nöqtənin bounds daxilində olub-olmadığını və görünüşün userInteractionEnabled olub-olmadığını yoxlayır. - Hadisənin çatdırılması: Hadisə tapılan görünüşə çatdırılır. Əgər görünüş hadisəni işlətmir (məsələn, uyğun jestə malik deyilsə və ya
touchesBegan:withEvent:-i həyata keçirir, amma işlətmir və yahitTestzamanınilqaytarırsa), hadisə növbəti responder-ə ötürülür (responder chain), adətən superview və ya görünüş kontrolörünə. - Jestlərin və ya toxunuş metodlarının işlənməsi: Əgər görünüşdə
UIGestureRecognizerkimi jest tanımaçları varsa, onlar ilk olaraq hadisəni alır. Jest tanınarsa, müvafiq Objective-C və ya Swift funksiyası ilə işlənir. Əgər jestlər hadisəni işlətməzsə və ya mövcud deyilsə, hadisə görünüşün toxunuş metodlarına ötürülür (touchesBegan(_:with:),touchesMoved(_:with:),touchesEnded(_:with:),touchesCancelled(_:with:)). - Loqikanın icrası: Jest və ya toxunuş metodunda istifadəçi loqikası yerinə yetirilir (məsələn, UI vəziyyətinin dəyişdirilməsi, naviqasiya və ya hərəkətin icrası).
- UI-nin yenilənməsi: Əgər loqika UI-də dəyişikliklərə səbəb olursa, framework yenidən çəkilmə üçün sorğu göndərir (əgər lazımdır).
Budur, düyməyə toxunuşun çox sadə işləmə nümunəsi:
// ViewController və ya başqa UIResponder sinifində
@IBAction func buttonTapped(_ sender: Any) {
// Düyməyə basıldıqda yerinə yetirilən loqika
print("Düymə basıldı!")
}
touchesBegan istifadə nümunəsi (sadə basmalar üçün daha az yayılmış):
// UIView-dən irsi olan istifadəçi tərtibində
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let location = touch.location(in: self)
print("Ekran toxunuldu CGPoint: \(location)")
// super çağırılmasa, növbəti responder-ə keçid dayandırılır
// super.touchesBegan(touches, with: event)
}