Middle
Ako možno určiť, či používateľ klikol na vrstvu (layer)?
sobes.tech AI
Odpoveď od AI
Môžete použiť testovanie zásahu: určiť, na ktorej vrstve došlo presne k dotyku. Core Animation poskytuje na to dve metódy:
-
hitTest(_:):- Kontroluje, či sa bod nachádza vo vnútri hraníc vrstvy alebo ktorejkoľvek jej podvrstvy.
- Vráti najhlbšiu podvrstvu (alebo vrstvu samotnú), ktorá obsahuje bod.
- Zohľadňuje
isHidden = true.
-
contains(_:):- Kontroluje iba, či sa bod nachádza vo vnútri hraníc samotnej vrstvy.
- Nezohľadňuje hierarchiu podvrstiev.
- Nezohľadňuje
isHidden.
Zvyčajne sa používa hitTest, pretože je presnejšie pri určovaní interaktivity.
Príklad použitia hitTest v obsluhe dotyku:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let locationInView = touch.location(in: view)
// Prevod bodu z súradníc pohľadu do súradníc vrstvy
let locationInLayer = myLayer.convert(locationInView, from: view.layer)
// Vykonanie hit testu
if let hitLayer = myLayer.hitTest(locationInLayer) {
if hitLayer === myLayer {
// Presne na myLayer
print("myLayer bol dotknutý")
} else {
// Na podvrstve v rámci myLayer
print("Podvrstva v rámci myLayer bola dotknutá")
// Identifikácia podvrstvy môže vyžadovať ďalšie kontroly
}
} else {
// Mimo myLayer a jeho podvrstiev
print("Mimo myLayer")
}
}
Dôležité body:
- Súradnice bodu dotyku (
location(in:)) sú vždy viazané naUIView. Je potrebné ich previesť do súradnicového systému vrstvy (convert(_, from:)aleboconvert(_, to:)). - Metóda
hitTest(_:)pracuje s bodmi v súradnicovom systéme volajúcej vrstvy (myLayer.hitTest(locationInLayer)). - Ak je vrstva neviditeľná (
alpha = 0aleboisHidden = true),hitTestvrátinil.containsvrátitrue, ak je bod vo vnútri hraníc, ignorujúc viditeľnosť. - Pre zložité hierarchie vrstiev môže byť potrebné rekurzívne vyhľadávanie alebo kontrola vrátenej
hitLayer.