Sobes.tech
Middle

Ilovada foydalanuvchi qatlamga (layer) bosganligini qanday aniqlash mumkin?

sobes.tech AI

AIdan javob

CALayer üzerindeki dokunuşları tespit etmek üçün bir neçə yanaşma mövcuddur:

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

    • UIView-in hitTest(_:with:) metodu, rekursiv olaraq alt görünüşlərin hierarxiyasını yoxlayır və verilmiş nöqtəni ən dərin olan görünüşü geri qaytarır.
    • Bu metod default olaraq görünüşlərlə əlaqəli qatmanları nəzərə alır.
    • Özəl görünüşdə hitTest(_:with:) metodunu üstələyərək daha detallı nəzarət edə və ya birbaşa alt qatlarda basmağa cavab verə bilərsiniz.
  2. Koordinatların convert ilə çevrilməsi:

    • Toxunma hadisəsi (məsələn, UIView metodlarında) alındıqda, toxunmanın koordinatları pəncərə (UIWindow) və ya görünmə görə alınır.
    • Bu koordinatların müəyyən bir qatda olub-olmadığını təyin etmək üçün, onları həmin qatın koordinat sisteminə çevirmək lazımdır.
    • Bunun üçün convert(_:from:) və ya convert(_:to:) metodlarından istifadə edilir.
    • Çevirildikdən sonra, nöqtənin qatın sərhədləri daxilində olub-olmadığını yoxlaya və ya contains(_:) kimi daha spesifik yoxlamalar edə bilərsiniz.
  3. UITapGestureRecognizer-i görünməyə əlavə etmək:

    • UIViewUITapGestureRecognizer əlavə edə bilərsiniz, hansı ki, qatla əlaqəlidir.
    • Geste handler-də, toxunma yerini görünməyə görə əldə edin.
    • Sonra, koordinat çevirmə metodundan (maddə 2) istifadə edərək, toxunma nöqtəsinin müvafiq 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 biri üçün UIView yaratmaqdır.
    • Onu yerləşdirin və ölçüsünü qatla uyğunlaşdırın.
    • Geste idarəediciləri (UITapGestureRecognizer) əlavə edin və ya touchesBegan, touchesEnded kimi metodları üstələyin.
    • Bu, UIKit-də istifadəçi girişlərini idarə etməyin ən idiomatik yoludur, çünki UIView bunun üçün xüsusi hazırlanıb.

hitTest istifadə nümunəsi:

// Özəl `UIView`-də
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    // Toxunma nöqtəsini alt qatın koordinatlarına çevirin
    let pointInLayer = mySublayer.convert(point, from: layer!)
    
    // Nöqtənin alt qatın sərhədləri daxilində olub-olmadığını yoxlayın
    if mySublayer.contains(pointInLayer) {
        // Əgər nöqtə alt qatda isə, onu və ya başqa bir görünüşü qaytara bilərsiniz
        // və ya lazım olan əməliyyatları yerinə yetirin.
        // Bu halda, toxunmanın "alt qat" üzərində olduğunu müəyyən edirik.
        print("mySublayer üzərində toxunma")
        // `nil` qaytarmaq olar, əgər bu görünüşün daha çox işləməsini istəmirsinizsə, və ya super.hitTest istifadə edin.
    }
    
    // Standart `hitTest`-in digər halları idarə etməsinə icazə verin
    return super.hitTest(point, with: event)
}

Geste idarəedicisində koordinatların çevrilməsinə nümunə:

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