Sobes.tech
Middle

Wie kann man feststellen, ob ein Benutzer auf eine Ebene (Layer) geklickt hat?

sobes.tech KI

Antwort von AI

Sie können den Hit-Test verwenden: Bestimmen, auf welcher Ebene die Berührung genau stattgefunden hat. Core Animation bietet dafür zwei Methoden:

  1. hitTest(_:):

    • Prüft, ob der Punkt innerhalb der Grenzen der Ebene oder einer ihrer Unterebenen liegt.
    • Gibt die tiefste Unterebene (oder die Ebene selbst) zurück, die den Punkt enthält.
    • Berücksichtigt isHidden = true.
  2. contains(_:):

    • Prüft nur, ob der Punkt innerhalb der Grenzen der Ebene liegt.
    • Berücksichtigt die Hierarchie der Unterebenen nicht.
    • Berücksichtigt isHidden nicht.

Normalerweise wird hitTest verwendet, da es genauer ist, um die Interaktivität zu bestimmen.

Beispiel für die Verwendung von hitTest in einem Touch-Handler:

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

    let locationInView = touch.location(in: view)

    // Konvertieren Sie den Punkt von den Koordinaten der Ansicht in die Koordinaten der Ebene
    let locationInLayer = myLayer.convert(locationInView, from: view.layer)

    // Führen Sie den Hit-Test durch
    if let hitLayer = myLayer.hitTest(locationInLayer) {
        if hitLayer === myLayer {
            // Genau myLayer berührt
            print("myLayer wurde berührt")
        } else {
            // Unterebene innerhalb von myLayer berührt
            print("Unterebene innerhalb von myLayer wurde berührt")
            // Die Identifikation der Unterebene kann zusätzliche Überprüfungen erfordern
        }
    } else {
        // Außerhalb von myLayer und seinen Unterebenen berührt
        print("Außerhalb von myLayer berührt")
    }
}

Wichtige Punkte:

  • Die Koordinaten des Berührungspunkts (location(in:)) sind immer an UIView gebunden. Sie müssen in das Koordinatensystem der Ebene (convert(_, from:) oder convert(_, to:)) umgewandelt werden.
  • Die Methode hitTest(_:) arbeitet mit Punkten im Koordinatensystem der aufrufenden Ebene (myLayer.hitTest(locationInLayer)).
  • Wenn die Ebene unsichtbar ist (alpha = 0 oder isHidden = true), gibt hitTest nil zurück. contains gibt true zurück, wenn der Punkt innerhalb der Grenzen liegt, unabhängig von der Sichtbarkeit.
  • Für komplexe Hierarchien von Ebenen kann eine rekursive Suche oder die Überprüfung der zurückgegebenen hitLayer erforderlich sein.