Sobes.tech
Middle

Tətbiqdə istifadəçinin qatlama (layer) üzərinə klik etdiyini necə müəyyən etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

CALayer-ə basmaq üçün bir neçə yanaşma istifadə edilə bilər:

  1. View-də hitTest(_:event:) istifadə etmək:

    • UIView-də hitTest(_:with:) metodu var, hansı ki, rekursiv olaraq alt view-lərin iyerarxiyasını keçir və verilmiş nöqtəni ehtiva edən ən dərin alt view-i qaytarır.
    • Bu metod default olaraq view-lərlə əlaqəli qatları nəzərə alır.
    • Xüsusi nəzarət və ya alt qatlarda birbaşa basma hadisələrini işləmək üçün hitTest(_:with:) metodunu özelleştirmək olar.
  2. Koordinatların convert ilə çevrilməsi:

    • Təsirə məruz qalan hadisə (məsələn, UIView metodlarında) sizdə toxunma koordinatları pəncərə (UIWindow) və ya view-ə görə verilir.
    • Bu koordinatların müəyyən qatın koordinat sisteminə çevrilməsi lazımdır.
    • Bunun üçün convert(_:from:) və ya convert(_:to:) metodlarından istifadə olunur.
    • Çevirmədən sonra, nöqtənin qatın sərhədləri daxilində olub-olmadığını yoxlamaq və ya contains(_:) kimi daha spesifik yoxlamalar etmək olar.
  3. UITapGestureRecognizer-i view-ə əlavə etmək:

    • UIViewUITapGestureRecognizer əlavə edə bilərsiniz.
    • Gest handler-də, toxunma yerini view-ə görə əldə edin.
    • Daha sonra, koordinatların çevrilməsi metodunu (nömrə 2) istifadə edərək, nöqtənin qat və ya onun alt qatlarında olub-olmadığını yoxlayın.
  4. Hər interaktiv qat üçün UIView yaratmaq:

    • Əgər qatlar interaktiv olmalıdırsa, ən sadə yol hər bir belə qat üçün uyğun UIView yaratmaqdır.
    • UIView-in ölçüsünü və yerləşməsini qatla uyğunlaşdırın.
    • Toxunma hadisələrini işləyən handler-lər (UITapGestureRecognizer) əlavə edin və ya touchesBegan, touchesEnded kimi metodları override edin.
    • Bu, UIKit-də istifadəçi girişini ən idiomatik şəkildə işləmək üçün ən yaxşı yoldur, çünki UIView bunun üçün xüsusi hazırlanıb.

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

// Özəl `UIView`-də
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    // Nöqtəni alt qatın koordinatlarına çeviririk
    let pointInLayer = mySublayer.convert(point, from: layer!)
    
    // Nöqtənin alt qatın sərhədləri daxilində olub-olmadığını yoxlayırıq
    if mySublayer.contains(pointInLayer) {
        // Əgər nöqtə alt qatın içindədirsə, özünü və ya başqa view-i qaytara bilərik,
        // və ya lazım olan əməliyyatları yerinə yetirə bilərik.
        print("mySublayer-ə basıldı")
        // Əgər bu view-un daha çox işləməsini istəmirsinizsə, nil qaytara bilərsiniz,
        // və ya standart davranış üçün super.hitTest-ə müraciət edə bilərsiniz.
    }
    
    // Standart `hitTest`-in digər halları işləməsinə imkan veririk
    return super.hitTest(point, with: event)
}

UITapGestureRecognizer-in handler-də koordinatların çevrilməsinə nümunə:

// `UITapGestureRecognizer`-ə bağlı olan özəl `UIView`-də
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    let tapLocationInView = sender.location(in: self)
    
    // Koordinatları view-dən alt qatın koordinatlarına çeviririk
    let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
    
    // Nöqtənin alt qatın sərhədləri daxilində olub-olmadığını yoxlayırıq
    if mySublayer.contains(tapLocationInSublayer) {
        print("mySublayer-ə basıldı")
        // Alt qatın basılması ilə əlaqəli əməliyyatları yerinə yetirin
    }
}