Sobes.tech
Middle

Comment peut-on déterminer si un utilisateur a cliqué sur une couche (layer) ?

sobes.tech IA

Réponse de l'IA

Vous pouvez utiliser le test de clic : déterminer sur quelle couche le contact a eu lieu. Core Animation fournit deux méthodes pour cela :

  1. hitTest(_:) :

    • Vérifie si le point se trouve à l’intérieur des limites de la couche ou de l’une de ses sous-couches.
    • Retourne la sous-couche la plus profonde (ou la couche elle-même) contenant le point.
    • Prend en compte isHidden = true.
  2. contains(_:) :

    • Vérifie uniquement si le point est à l’intérieur des limites de la couche elle-même.
    • Ne considère pas la hiérarchie des sous-couches.
    • Ne prend pas en compte isHidden.

Généralement, on utilise hitTest, car il est plus précis pour déterminer l’interactivité.

Exemple d’utilisation de hitTest dans un gestionnaire de touches :

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

    let locationInView = touch.location(in: view)

    // Convertir le point des coordonnées de la vue en coordonnées de la couche
    let locationInLayer = myLayer.convert(locationInView, from: view.layer)

    // Effectuer le test de clic
    if let hitLayer = myLayer.hitTest(locationInLayer) {
        if hitLayer === myLayer {
            // Touché précisément myLayer
            print("Touché myLayer")
        } else {
            // Touché une sous-couche dans myLayer
            print("Touché une sous-couche dans myLayer")
            // L’identification de la sous-couche peut nécessiter des vérifications supplémentaires
        }
    } else {
        // Touché en dehors de myLayer et ses sous-couches
        print("Touché en dehors de myLayer")
    }
}

Points importants :

  • Les coordonnées du point de contact (location(in:)) sont toujours liées à UIView. Il faut les convertir dans le système de coordonnées de la couche (convert(_, from:) ou convert(_, to:)).
  • La méthode hitTest(_:) fonctionne avec des points dans le système de coordonnées de la couche appelante (myLayer.hitTest(locationInLayer)).
  • Si la couche est invisible (alpha = 0 ou isHidden = true), hitTest renverra nil. contains renverra true si le point est à l’intérieur des limites, en ignorant la visibilité.
  • Pour des hiérarchies complexes de couches, il peut être nécessaire de faire une recherche récursive ou de vérifier la couche retournée par hitLayer.