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

  1. Hadisənin alınması: Hardware (tac-kontrolör) toxunuşu qeyd edir və hadisə yaradır.
  2. 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.).
  3. SpringBoard-ə hadisənin göndərilməsi: IOKit hadisəni sistem prosesi olan SpringBoard-a ötürür.
  4. 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.
  5. UIKit/SwiftUI-də hadisənin qəbul edilməsi: Tətbiqdə hadisə framework (UIKit və ya SwiftUI) tərəfindən qəbul edilir.
  6. Hadisənin növbəyə əlavə edilməsi: Hadisə tətbiqin hadisə işləmə növbəsinə əlavə olunur.
  7. Tətbiq tərəfindən hadisənin alınması: Əsas dövr (Run Loop) növbədən hadisəni çıxarır.
  8. UIResponder vasitəsilə hadisənin işlənməsi: Hadisə UIEvent obyektinə ötürülür. UIKit hadisənin çatdırılma prosesinə başlayır, adətən UIWindow obyektindən başlayır.
  9. 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.
  10. 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ə ya hitTest zamanı nil qaytarırsa), hadisə növbəti responder-ə ötürülür (responder chain), adətən superview və ya görünüş kontrolörünə.
  11. Jestlərin və ya toxunuş metodlarının işlənməsi: Əgər görünüşdə UIGestureRecognizer kimi 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:)).
  12. 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ı).
  13. 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)
}