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:
-
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.
-
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 oUIView. É necessário convertê-las para o sistema de coordenadas da camada (convert(_, from:)ouconvert(_, 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 = 0ouisHidden = true),hitTestretornaránil.containsretornarátruese 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.