Middle
Come si può determinare se un utente ha cliccato su uno strato (layer)?
sobes.tech AI
Risposta dell'AI
Puoi usare il test di hit: determinare su quale livello si è verificato esattamente il tocco. Core Animation fornisce due metodi per questo:
-
hitTest(_:):- Verifica se il punto si trova all’interno dei confini del livello o di uno dei suoi sotto livelli.
- Restituisce il sotto livello più profondo (o lo stesso livello) che contiene il punto.
- Tiene conto di
isHidden = true.
-
contains(_:):- Verifica solo se il punto si trova all’interno dei confini del livello stesso.
- Non considera la gerarchia dei sotto livelli.
- Non tiene conto di
isHidden.
Di solito si usa hitTest, poiché è più preciso per determinare l’interattività.
Esempio di utilizzo di hitTest in un gestore di tocchi:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let locationInView = touch.location(in: view)
// Convertiamo il punto dalle coordinate della vista alle coordinate del livello
let locationInLayer = myLayer.convert(locationInView, from: view.layer)
// Eseguiamo il hit test
if let hitLayer = myLayer.hitTest(locationInLayer) {
if hitLayer === myLayer {
// Toccatto esattamente myLayer
print("Tocco su myLayer")
} else {
// Toccatto su un sotto livello di myLayer
print("Tocco su sotto livello di myLayer")
// L’identificazione del sotto livello può richiedere controlli aggiuntivi
}
} else {
// Toccatto fuori da myLayer e i suoi sotto livelli
print("Tocco fuori da myLayer")
}
}
Punti importanti:
- Le coordinate del tocco (
location(in:)) sono sempre legate aUIView. È necessario convertirle nel sistema di coordinate del livello (convert(_, from:)oconvert(_, to:)). - Il metodo
hitTest(_:)lavora con punti nel sistema di coordinate del livello chiamante (myLayer.hitTest(locationInLayer)). - Se il livello è invisibile (
alpha = 0oisHidden = true),hitTestrestituirànil.containsrestituiràtruese il punto è all’interno dei confini, ignorando la visibilità. - Per gerarchie complesse di livelli, potrebbe essere necessario effettuare una ricerca ricorsiva o verificare il livello restituito da
hitLayer.