Sobes.tech
Middle

Ako možno určiť, či používateľ klikol na vrstvu (layer)?

sobes.tech AI

Odpoveď od AI

Môžete použiť testovanie zásahu: určiť, na ktorej vrstve došlo presne k dotyku. Core Animation poskytuje na to dve metódy:

  1. hitTest(_:):

    • Kontroluje, či sa bod nachádza vo vnútri hraníc vrstvy alebo ktorejkoľvek jej podvrstvy.
    • Vráti najhlbšiu podvrstvu (alebo vrstvu samotnú), ktorá obsahuje bod.
    • Zohľadňuje isHidden = true.
  2. contains(_:):

    • Kontroluje iba, či sa bod nachádza vo vnútri hraníc samotnej vrstvy.
    • Nezohľadňuje hierarchiu podvrstiev.
    • Nezohľadňuje isHidden.

Zvyčajne sa používa hitTest, pretože je presnejšie pri určovaní interaktivity.

Príklad použitia hitTest v obsluhe dotyku:

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

    let locationInView = touch.location(in: view)

    // Prevod bodu z súradníc pohľadu do súradníc vrstvy
    let locationInLayer = myLayer.convert(locationInView, from: view.layer)

    // Vykonanie hit testu
    if let hitLayer = myLayer.hitTest(locationInLayer) {
        if hitLayer === myLayer {
            // Presne na myLayer
            print("myLayer bol dotknutý")
        } else {
            // Na podvrstve v rámci myLayer
            print("Podvrstva v rámci myLayer bola dotknutá")
            // Identifikácia podvrstvy môže vyžadovať ďalšie kontroly
        }
    } else {
        // Mimo myLayer a jeho podvrstiev
        print("Mimo myLayer")
    }
}

Dôležité body:

  • Súradnice bodu dotyku (location(in:)) sú vždy viazané na UIView. Je potrebné ich previesť do súradnicového systému vrstvy (convert(_, from:) alebo convert(_, to:)).
  • Metóda hitTest(_:) pracuje s bodmi v súradnicovom systéme volajúcej vrstvy (myLayer.hitTest(locationInLayer)).
  • Ak je vrstva neviditeľná (alpha = 0 alebo isHidden = true), hitTest vráti nil. contains vráti true, ak je bod vo vnútri hraníc, ignorujúc viditeľnosť.
  • Pre zložité hierarchie vrstiev môže byť potrebné rekurzívne vyhľadávanie alebo kontrola vrátenej hitLayer.