Sobes.tech
Middle

Hoe kan worden vastgesteld of een gebruiker op een laag (layer) heeft geklikt?

sobes.tech AI

Antwoord van AI

Je kunt hit testing gebruiken: bepalen op welk laag de aanraking precies heeft plaatsgevonden. Core Animation biedt hiervoor twee methoden:

  1. hitTest(_:):

    • Controleert of het punt binnen de grenzen van het laag of een van zijn onderlagen ligt.
    • Geeft de diepste onderlaag (of het laag zelf) terug die het punt bevat.
    • Neemt isHidden = true in overweging.
  2. contains(_:):

    • Controleert alleen of het punt binnen de grenzen van het eigen laag ligt.
    • Neemt de hiërarchie van onderlagen niet in overweging.
    • Neemt isHidden niet in overweging.

Meestal wordt hitTest gebruikt, omdat het preciezer is voor het bepalen van interactiviteit.

Voorbeeld van gebruik van hitTest in een touch-handler:

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

    let locationInView = touch.location(in: view)

    // Converteer het punt van view-coördinaten naar laag-coördinaten
    let locationInLayer = myLayer.convert(locationInView, from: view.layer)

    // Voer de hit test uit
    if let hitLayer = myLayer.hitTest(locationInLayer) {
        if hitLayer === myLayer {
            // Exact op myLayer getikt
            print("myLayer is getikt")
        } else {
            // Op een sublaag binnen myLayer getikt
            print("Sublaag binnen myLayer is getikt")
            // Identificatie van de sublaag kan extra controles vereisen
        }
    } else {
        // Buiten myLayer en zijn sublagen getikt
        print("Buiten myLayer getikt")
    }
}

Belangrijke punten:

  • De coördinaten van de aanraking (location(in:)) zijn altijd gekoppeld aan UIView. Ze moeten worden omgezet naar het coördinatensysteem van de laag (convert(_, from:) of convert(_, to:)).
  • De methode hitTest(_:) werkt met punten in het coördinatensysteem van de aanroepende laag (myLayer.hitTest(locationInLayer)).
  • Als de laag onzichtbaar is (alpha = 0 of isHidden = true), zal hitTest nil teruggeven. contains geeft true terug als het punt binnen de grenzen ligt, ongeacht de zichtbaarheid.
  • Voor complexe hiërarchieën van lagen kan een recursieve zoekopdracht of het controleren van de geretourneerde hitLayer nodig zijn.