Sobes.tech
Middle

Como se pode determinar se um utilizador clicou numa camada (layer)?

sobes.tech IA

Resposta da IA

Pode usar o teste de toque: determinar em qual camada ocorreu exatamente o toque. O Core Animation fornece dois métodos para isso:

  1. hitTest(_:):

    • Verifica se o ponto está dentro dos limites da camada ou de qualquer uma das suas subcamadas.
    • Retorna a subcamada mais profunda (ou a própria camada) que contém o ponto.
    • Considera isHidden = true.
  2. contains(_:):

    • Verifica apenas se o ponto está dentro dos limites da própria camada.
    • Não considera a hierarquia de subcamadas.
    • Não considera isHidden.

Normalmente, usa-se hitTest, pois é mais preciso para determinar a interatividade.

Exemplo de uso de hitTest num manipulador de toques:

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

    let locationInView = touch.location(in: view)

    // Converter o ponto das coordenadas da view para as coordenadas da camada
    let locationInLayer = myLayer.convert(locationInView, from: view.layer)

    // Executar o hit test
    if let hitLayer = myLayer.hitTest(locationInLayer) {
        if hitLayer === myLayer {
            // Tocou exatamente na myLayer
            print("Tocou na myLayer")
        } else {
            // Tocou numa subcamada dentro da myLayer
            print("Tocou numa subcamada dentro da myLayer")
            // A identificação da subcamada pode requerer verificações adicionais
        }
    } else {
        // Tocou fora da myLayer e das suas subcamadas
        print("Tocou fora da myLayer")
    }
}

Pontos importantes:

  • As coordenadas do toque (location(in:)) estão sempre relacionadas com o UIView. É necessário convertê-las para o sistema de coordenadas da camada (convert(_, from:) ou convert(_, to:)).
  • O método hitTest(_:) funciona com pontos no sistema de coordenadas da camada que chama (myLayer.hitTest(locationInLayer)).
  • Se a camada estiver invisível (alpha = 0 ou isHidden = true), hitTest retornará nil. contains retornará true se o ponto estiver dentro dos limites, ignorando a visibilidade.
  • Para hierarquias complexas de camadas, pode ser necessário fazer uma busca recursiva ou verificar a camada retornada por hitLayer.