Sobes.tech
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:

  1. Korišćenje hitTest(_:event:) u prikazu (View):

    • UIView ima metodu hitTest(_: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.
  2. 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:) ili convert(_:to:) CALayer.
    • Nakon konverzije, možete proveriti da li je tačka unutar granica sloja (bounds) ili koristiti specifičnije provere poput contains(_:).
  3. Prikačenje UITapGestureRecognizer na prikaz:

    • Možete dodati gest UITapGestureRecognizer na UIView koji 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.
  4. Kreiranje UIView za 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 UIView u skladu sa slojem.
    • Dodajte rukovaoce gestova (UITapGestureRecognizer) ili prepisujte metode obrade događaja dodira (touchesBegan, touchesEnded itd.) u tom prikazu.
    • Ovo je najidiomatski način obrade korisničkog unosa u UIKit, jer je UIView posebno namenjen za to.

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
    }
}