Middle
Hogyan lehet meghatározni, hogy a felhasználó rákattintott-e egy rétegre (layer) az alkalmazásban?
sobes.tech MI
Válasz az MI-től
CALayer-re való kattintás meghatározásához több megközelítés is létezik:
-
A
hitTest(_:event:)használata nézetben (View):- A
UIViewrendelkezik ahitTest(_:with:)metódussal, amely rekurzívan végigmegy az alnézetek hierarchiáján, és visszaadja a legmélyebb alnézetet, amely tartalmazza a megadott pontot. - Ez a módszer alapértelmezés szerint figyelembe veszi a nézetekhez kapcsolódó rétegeket.
- Felülírhatja a
hitTest(_:with:)metódust egy egyedi nézetben, hogy részletesebb kontrollt vagy közvetlen kattintáskezelést valósítson meg az alrétegeken.
- A
-
Koordináták konvertálása a
convertsegítségével:- Amikor érintési eseményt (pl.
UIView-ben) kap, akkor az érintés koordinátái aUIWindow-hoz vagy a nézethez viszonyítva vannak. - Annak meghatározásához, hogy az érintés egy adott rétegen történt-e, ezeket a koordinátákat át kell konvertálni az adott réteg koordináta-rendszerébe.
- Ehhez a
convert(_:from:)vagyconvert(_:to:)metódusokat használják aCALayer-en. - A konvertálás után ellenőrizhető, hogy a pont a réteg
bounds-án belül van-e, vagy más specifikus ellenőrzéseket lehet végezni, például acontains(_:)-t.
- Amikor érintési eseményt (pl.
-
A
UITapGestureRecognizerhozzáadása a nézethez:- Egy
UITapGestureRecognizer-t hozzáadhat a réthez kapcsolódóUIView-hez. - A gesztus kezelőben a kattintás helyét a nézethez viszonyítva lehet lekérdezni.
- Ezután a koordináták konvertálásának megközelítését (2. lépés) alkalmazva ellenőrizhető, hogy a kattintás a kívánt rétegen vagy annak alrétegein belül történt-e.
- Egy
-
Minden interaktív réteghez külön
UIViewlétrehozása:- Ha vannak olyan rétegek, amelyek interaktívak kell legyenek, legegyszerűbb módja, ha minden ilyen réteghez egy megfelelő
UIView-t hozunk létre. - A
UIViewpozícióját és méretét a réteghez igazítjuk. - Hozzáadunk gesztuskezelőket (
UITapGestureRecognizer) vagy felülírjuk az érintéskezelő metódusokat (touchesBegan,touchesEndedstb.) ebben a nézetben. - Ez a legidiomatikusabb módja a felhasználói bemenet kezelésének UIKit-ben, mivel a
UIViewerre van kifejezetten tervezve.
- Ha vannak olyan rétegek, amelyek interaktívak kell legyenek, legegyszerűbb módja, ha minden ilyen réteghez egy megfelelő
Példa a hitTest használatára UIView-ben:
// Egy egyedi `UIView`-ben
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
// Az érintési pont konvertálása a sublayer koordinátáira
let pointInLayer = mySublayer.convert(point, from: layer!)
// Ellenőrzés, hogy a pont a sublayer határain belül van-e
if mySublayer.contains(pointInLayer) {
// Ha a pont a sublayer-ben van, visszaadhatjuk magunkat vagy más nézetet,
// vagy végrehajthatunk szükséges műveleteket.
print("Kattintás a mySublayer-en")
// Vissza lehet adni nil-t, ha nem akarjuk, hogy ez a nézet tovább kezelje,
// vagy a super.hitTest-et, ha meg akarjuk tartani az alapértelmezett viselkedést.
}
// Engedélyezzük a szokásos `hitTest`-et, hogy kezelje a többi esetet
return super.hitTest(point, with: event)
}
Példa a koordináták konvertálására gesztuskezelőben:
// Egy `UIView`-ben, amelyhez `UITapGestureRecognizer` van csatolva
@objc func handleTap(_ sender: UITapGestureRecognizer) {
let tapLocationInView = sender.location(in: self)
// A kattintási hely konvertálása a sublayer koordinátáira
let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
// Ellenőrzés, hogy a pont a sublayer határain belül van-e
if mySublayer.contains(tapLocationInSublayer) {
print("Kattintás a mySublayer-en")
// Végrehajtandó műveletek a sublayer kattintásakor
}
}