Middle
Kako odrediti da li je korisnik kliknuo na sloj (layer) u aplikaciji?
sobes.tech АИ
Одговор од АИ
Za određivanje pritiska na CALayer, može se koristiti nekoliko pristupa:
-
Korišćenje
hitTest(_:event:)u prikazu (View):UIViewima metoduhitTest(_:with:), koja rekurzivno prolazi kroz hijerarhiju podprikaza i vraća najdublji podprikaz koji sadrži datu tačku.- Ova metoda podrazumevano uzima u obzir slojeve povezane sa prikazima.
- Možete prepisati
hitTest(_:with:)u prilagođenom prikazu za detaljniju kontrolu ili za obradu pritisaka direktno na pod-slojevima.
-
Transformacija koordinata pomoću
convert:- Kada primate događaj dodira (npr. u metodama
UIView), imate koordinate dodira u odnosu na prozor (UIWindow) ili prikaz. - Da biste odredili da li je dodir na određenom sloju, potrebno je da te koordinate konvertujete u koordinatni sistem tog sloja.
- Za to se koriste metode
convert(_:from:)iliconvert(_:to:)CALayer. - Nakon konverzije, možete proveriti da li je tačka unutar granica sloja (
bounds) ili koristiti specifičnije provere poputcontains(_:).
- Kada primate događaj dodira (npr. u metodama
-
Prikačenje
UITapGestureRecognizerna prikaz:- Možete dodati gest
UITapGestureRecognizernaUIViewkoji je povezan sa slojem. - U rukovaocu gestu, dobijate lokaciju dodira u odnosu na prikaz.
- Zatim koristite pristup konverziji koordinata (tačka 2) da biste proverili da li je tačka dodira unutar željenog sloja ili njegovih pod slojeva.
- Možete dodati gest
-
Kreiranje
UIViewza svaki interaktivni sloj:- Ako imate slojeve koji treba da budu interaktivni, najjednostavniji način je da za svaki takav sloj napravite odgovarajući
UIView. - Postavite i podesite veličinu
UIViewu skladu sa slojem. - Dodajte rukovaoce gestova (
UITapGestureRecognizer) ili prepisujte metode obrade događaja dodira (touchesBegan,touchesEndeditd.) u tom prikazu. - Ovo je najidiomatski način obrade korisničkog unosa u UIKit, jer je
UIViewposebno namenjen za to.
- Ako imate slojeve koji treba da budu interaktivni, najjednostavniji način je da za svaki takav sloj napravite odgovarajući
Primer korišćenja hitTest u UIView:
// U prilagođenom `UIView`
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
// Konvertovanje tačke dodira u koordinate pod slojem
let pointInLayer = mySublayer.convert(point, from: layer!)
// Provera da li je tačka unutar granica pod slojem
if mySublayer.contains(pointInLayer) {
// Ako je tačka unutar pod sloja, možemo vratiti sebe ili drugi prikaz,
// ili izvršiti potrebne radnje.
print("Pristup na mySublayer")
// Možemo vratiti nil ako ne želimo da ovaj prikaz dalje obrađuje,
// ili pozvati super.hitTest(point, with: event) ako želimo da sačuvamo standardno ponašanje.
}
// Dozvoljavamo standardni `hitTest` da obrađuje ostale slučajeve
return super.hitTest(point, with: event)
}
Primer korišćenja konverzije koordinata u rukovaocu gestova:
// U prilagođenom `UIView` sa prikačenim `UITapGestureRecognizer`
@objc func handleTap(_ sender: UITapGestureRecognizer) {
let tapLocationInView = sender.location(in: self)
// Konvertovanje tačke dodira iz koordinata prikaza u koordinate pod slojem
let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
// Provera da li je tačka unutar granica pod slojem
if mySublayer.contains(tapLocationInSublayer) {
print("Pristup na mySublayer")
// Izvršite radnje povezane sa pritiskom na pod sloj
}
}