Sobes.tech
Middle

Hogyan lehet megállapítani, hogy a felhasználó rákattintott-e egy rétegre (layer)?

sobes.tech MI

Válasz az MI-től

Használhatja a hit tesztelést: meghatározni, hogy pontosan melyik rétegen történt az érintés. A Core Animation két módszert kínál ehhez:

  1. hitTest(_:):

    • Ellenőrzi, hogy a pont a réteg vagy bármely alréteg határain belül van-e.
    • Visszaadja a legmélyebb alréteget (vagy a réteget magát), amely tartalmazza a pontot.
    • Figyelembe veszi az isHidden = true értéket.
  2. contains(_:):

    • Csak azt ellenőrzi, hogy a pont a réteg határain belül van-e.
    • Nem veszi figyelembe az alrétegek hierarchiáját.
    • Nem veszi figyelembe az isHidden értéket.

Általában a hitTest-et használják, mivel pontosabb az interaktivitás meghatározásában.

Példa a hitTest használatára érintéskezelőben:

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

    let locationInView = touch.location(in: view)

    // A pont átalakítása a nézet koordinátáiból a réteg koordinátáiba
    let locationInLayer = myLayer.convert(locationInView, from: view.layer)

    // Hit teszt végrehajtása
    if let hitLayer = myLayer.hitTest(locationInLayer) {
        if hitLayer === myLayer {
            // Pont pontosan a myLayer-en
            print("myLayer-t érintette")
        } else {
            // Alrétegre érintett a myLayer-en belül
            print("Alrétegre érintett a myLayer-en belül")
            // Az alréteg azonosítása további ellenőrzéseket igényelhet
        }
    } else {
        // Kívül esett a myLayer és alrétegei
        print("myLayer-en kívül érintett")
    }
}

Fontos pontok:

  • Az érintés koordinátái (location(in:)) mindig a UIView-hez kötöttek. Átalakításuk szükséges a réteg koordináta rendszerébe (convert(_, from:) vagy convert(_, to:)).
  • A hitTest(_:) metódus a hívó réteg koordináta rendszerében működik (myLayer.hitTest(locationInLayer)).
  • Ha a réteg láthatatlan (alpha = 0 vagy isHidden = true), a hitTest nil-t ad vissza. A contains true-t ad, ha a pont a határokon belül van, figyelmen kívül hagyva a láthatóságot.
  • Komplex réteghierarchiák esetén szükség lehet rekurzív keresésre vagy a visszakapott hitLayer ellenőrzésére.