Middle
Cum se poate determina dacă un utilizator a făcut clic pe un strat (layer)?
sobes.tech AI
Răspuns de la AI
Se poate folosi testarea prin hit: determinarea exactă a stratului pe care a avut loc atingerea. Core Animation oferă două metode pentru aceasta:
-
hitTest(_:):- Verifică dacă punctul se află în interiorul limitelor stratului sau al unuia dintre sub-straturile sale.
- Returnează cel mai profund sub-strat (sau stratul însuși) care conține punctul.
- Ia în considerare
isHidden = true.
-
contains(_:):- Verifică doar dacă punctul se află în interiorul limitelor stratului.
- Nu ia în considerare ierarhia sub-straturilor.
- Nu ia în considerare
isHidden.
De obicei, se folosește hitTest, deoarece este mai precis pentru determinarea interactivității.
Exemplu de utilizare a hitTest într-un handler de atingere:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let locationInView = touch.location(in: view)
// Convertim punctul din coordonatele view în coordonatele stratului
let locationInLayer = myLayer.convert(locationInView, from: view.layer)
// Executăm hit test
if let hitLayer = myLayer.hitTest(locationInLayer) {
if hitLayer === myLayer {
// Atingere exact pe myLayer
print("myLayer a fost atins")
} else {
// Atingere pe un sub-strat în interiorul myLayer
print("sub-strat în interiorul myLayer a fost atins")
// Identificarea sub-stratului poate necesita verificări suplimentare
}
} else {
// Atingere în afara myLayer și sub-straturilor sale
print("Atingere în afara myLayer")
}
}
Puncte importante:
- Coordonatele punctului de atingere (
location(in:)) sunt întotdeauna legate deUIView. Este necesar să le convertiți în sistemul de coordonate al stratului (convert(_, from:)sauconvert(_, to:)). - Metoda
hitTest(_:)funcționează cu puncte în sistemul de coordonate al stratului care o apelează (myLayer.hitTest(locationInLayer)). - Dacă stratul este invizibil (
alpha = 0sauisHidden = true),hitTestva returnanil.containsva returnatruedacă punctul se află în limite, ignorând vizibilitatea. - Pentru ierarhii complexe de straturi, poate fi necesar să faceți o căutare recursivă sau să verificați stratul returnat de
hitLayer.