Middle
Hogyan lehet megállapítani, hogy a felhasználó rákattintott-e egy rétegre (layer)?
sobes.tech MI
Válasz az MI-től
Használhatja a hit tesztelést: meghatározni, hogy pontosan melyik rétegen történt az érintés. A Core Animation két módszert kínál ehhez:
-
hitTest(_:):- Ellenőrzi, hogy a pont a réteg vagy bármely alréteg határain belül van-e.
- Visszaadja a legmélyebb alréteget (vagy a réteget magát), amely tartalmazza a pontot.
- Figyelembe veszi az
isHidden = trueértéket.
-
contains(_:):- Csak azt ellenőrzi, hogy a pont a réteg határain belül van-e.
- Nem veszi figyelembe az alrétegek hierarchiáját.
- Nem veszi figyelembe az
isHiddenértéket.
Általában a hitTest-et használják, mivel pontosabb az interaktivitás meghatározásában.
Példa a hitTest használatára érintéskezelőben:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let locationInView = touch.location(in: view)
// A pont átalakítása a nézet koordinátáiból a réteg koordinátáiba
let locationInLayer = myLayer.convert(locationInView, from: view.layer)
// Hit teszt végrehajtása
if let hitLayer = myLayer.hitTest(locationInLayer) {
if hitLayer === myLayer {
// Pont pontosan a myLayer-en
print("myLayer-t érintette")
} else {
// Alrétegre érintett a myLayer-en belül
print("Alrétegre érintett a myLayer-en belül")
// Az alréteg azonosítása további ellenőrzéseket igényelhet
}
} else {
// Kívül esett a myLayer és alrétegei
print("myLayer-en kívül érintett")
}
}
Fontos pontok:
- Az érintés koordinátái (
location(in:)) mindig aUIView-hez kötöttek. Átalakításuk szükséges a réteg koordináta rendszerébe (convert(_, from:)vagyconvert(_, to:)). - A
hitTest(_:)metódus a hívó réteg koordináta rendszerében működik (myLayer.hitTest(locationInLayer)). - Ha a réteg láthatatlan (
alpha = 0vagyisHidden = true), ahitTestnil-t ad vissza. Acontainstrue-t ad, ha a pont a határokon belül van, figyelmen kívül hagyva a láthatóságot. - Komplex réteghierarchiák esetén szükség lehet rekurzív keresésre vagy a visszakapott
hitLayerellenőrzésére.