Sobes.tech
Middle

Cum se poate determina dacă un utilizator a făcut clic pe un strat (layer)?

sobes.tech AI

Răspuns de la AI

Se poate folosi testarea prin hit: determinarea exactă a stratului pe care a avut loc atingerea. Core Animation oferă două metode pentru aceasta:

  1. hitTest(_:):

    • Verifică dacă punctul se află în interiorul limitelor stratului sau al unuia dintre sub-straturile sale.
    • Returnează cel mai profund sub-strat (sau stratul însuși) care conține punctul.
    • Ia în considerare isHidden = true.
  2. contains(_:):

    • Verifică doar dacă punctul se află în interiorul limitelor stratului.
    • Nu ia în considerare ierarhia sub-straturilor.
    • Nu ia în considerare isHidden.

De obicei, se folosește hitTest, deoarece este mai precis pentru determinarea interactivității.

Exemplu de utilizare a hitTest într-un handler de atingere:

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

    let locationInView = touch.location(in: view)

    // Convertim punctul din coordonatele view în coordonatele stratului
    let locationInLayer = myLayer.convert(locationInView, from: view.layer)

    // Executăm hit test
    if let hitLayer = myLayer.hitTest(locationInLayer) {
        if hitLayer === myLayer {
            // Atingere exact pe myLayer
            print("myLayer a fost atins")
        } else {
            // Atingere pe un sub-strat în interiorul myLayer
            print("sub-strat în interiorul myLayer a fost atins")
            // Identificarea sub-stratului poate necesita verificări suplimentare
        }
    } else {
        // Atingere în afara myLayer și sub-straturilor sale
        print("Atingere în afara myLayer")
    }
}

Puncte importante:

  • Coordonatele punctului de atingere (location(in:)) sunt întotdeauna legate de UIView. Este necesar să le convertiți în sistemul de coordonate al stratului (convert(_, from:) sau convert(_, to:)).
  • Metoda hitTest(_:) funcționează cu puncte în sistemul de coordonate al stratului care o apelează (myLayer.hitTest(locationInLayer)).
  • Dacă stratul este invizibil (alpha = 0 sau isHidden = true), hitTest va returna nil. contains va returna true dacă punctul se află în limite, ignorând vizibilitatea.
  • Pentru ierarhii complexe de straturi, poate fi necesar să faceți o căutare recursivă sau să verificați stratul returnat de hitLayer.