Sobes.tech
Middle

İstifadəçinin qatlama (layer) üzərinə klik edib-etmədiyini necə müəyyən etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Toxunma testindən istifadə etmək mümkündür: dəqiq olaraq hansı qatlamda toxunuş baş verdiyini müəyyən etmək. Core Animation bunun üçün iki metod təqdim edir:

  1. hitTest(_:):

    • Nöqtənin qatlamın sərhədləri daxilində və ya onun alt qatlamlarından hər hansı birində olub-olmadığını yoxlayır.
    • Nöqtəni ehtiva edən ən dərin alt qatlamı (və ya qatlamı özü) qaytarır.
    • isHidden = true-i nəzərə alır.
  2. contains(_:):

    • Yalnız nöqtənin qatlamın sərhədləri daxilində olub-olmadığını yoxlayır.
    • Alt qatlamların hierarxiyasını nəzərə almır.
    • isHidden-i nəzərə alır.

Əksər hallarda, interaktivliyi müəyyən etmək üçün hitTest istifadə olunur, çünki daha dəqiqdir.

hitTest-in istifadəsinə nümunə:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first else { return }

    let locationInView = touch.location(in: view)

    // Nöqtəni view koordinatlarından qatlam koordinatlarına çeviririk
    let locationInLayer = myLayer.convert(locationInView, from: view.layer)

    // Hit test həyata keçiririk
    if let hitLayer = myLayer.hitTest(locationInLayer) {
        if hitLayer === myLayer {
            // Dəqiq olaraq myLayer-ə toxundu
            print("myLayer-ə toxunuldu")
        } else {
            // myLayer daxilində alt qatlama toxundu
            print("myLayer daxilində alt qatlama toxundu")
            // Alt qatlamın identifikasiyası əlavə yoxlamalar tələb edə bilər
        }
    } else {
        // myLayer və onun alt qatlamları xaricində toxundu
        print("myLayer-dən kənarda toxundu")
    }
}

Vacib nöqtələr:

  • Toxunma nöqtəsinin koordinatları (location(in:)) həmişə UIView-ə bağlıdır. Onları qatlamın koordinat sisteminə çevirmək lazımdır (convert(_, from:) və ya convert(_, to:)).
  • hitTest(_:) metodu çağıran qatlamın koordinat sistemində işləyir (myLayer.hitTest(locationInLayer)).
  • Əgər qatlam görünməzdirsə (alpha = 0 və ya isHidden = true), hitTest nil qaytaracaq. contains isə, görünməzliyi nəzərə almadan, nöqtənin sərhədlər daxilində olub-olmadığını yoxlayır.
  • Kompleks qatlam hierarxiyaları üçün, rekursiv axtarış və ya qaytarılan hitLayer-in yoxlanması lazım ola bilər.