Sobes.tech
Middle

Ako určiť, či používateľ klikol na vrstvu (layer) v aplikácii?

sobes.tech AI

Odpoveď od AI

Pre určenia stlačenia na CALayer je možné použiť niekoľko prístupov:

  1. Použitie hitTest(_:event:) v pohľade (View):

    • UIView má metódu hitTest(_:with:), ktorá rekurzívne prechádza hierarchiu podpohľadov a vracia najhlbší podpohľad, ktorý obsahuje daný bod.
    • Táto metóda predvolene zohľadňuje vrstvy spojené s pohľadmi.
    • Môžete prepísať hitTest(_:with:) vo vlastnom pohľade pre detailnejšiu kontrolu alebo na spracovanie stlačení priamo na podvrstvách.
  2. Transformácia súradníc pomocou convert:

    • Pri zachytení udalosti dotyku (napríklad v metódach UIView) máte súradnice dotyku vo vzťahu k oknu (UIWindow) alebo pohľadu.
    • Aby ste určili, či je dotyk na určitom vrstvu, je potrebné tieto súradnice previesť do súradnicového systému tejto vrstvy.
    • Na to slúžia metódy convert(_:from:) alebo convert(_:to:) CALayer.
    • Po konverzii môžete skontrolovať, či bod leží vo vnútri hraníc vrstvy (bounds) alebo použiť špecifickejšie kontroly ako contains(_:).
  3. Pripojenie UITapGestureRecognizer k pohľadu:

    • Môžete pripojiť gest UITapGestureRecognizer k UIView, ktorý je spojený so stratou.
    • Vo spracovateľovi gestu získate polohu dotyku vo vzťahu k pohľadu.
    • Následne použijete prístup s konverziou súradníc (bod 2), aby ste overili, či je bod dotyku vo vnútri požadovanej vrstvy alebo jej podvrstiev.
  4. Vytvorenie UIView pre každý interaktívny vrstvu:

    • Ak máte vrstvy, ktoré majú byť interaktívne, najjednoduchší spôsob je vytvoriť pre každú takú vrstvu zodpovedajúci UIView.
    • Umiestnite a nastavte veľkosť UIView v súlade s vrstvou.
    • Pripojte obslužné rutiny gest (UITapGestureRecognizer) alebo prepíšte metódy spracovania udalostí dotyku (touchesBegan, touchesEnded atď.) v tomto pohľade.
    • Toto je najidiomatickejší spôsob spracovania používateľského vstupu v UIKit, pretože UIView je na to špeciálne určený.

Príklad použitia hitTest v UIView:

// V prispôsobenom `UIView`
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    // Konverzia bodu dotyku na súradnice podvrstvy
    let pointInLayer = mySublayer.convert(point, from: layer!)
    
    // Kontrola, či je bod vo vnútri hraníc podvrstvy
    if mySublayer.contains(pointInLayer) {
        // Ak je bod vo vnútri podvrstvy, môžeme vrátiť seba alebo iný pohľad,
        // alebo vykonať potrebné akcie.
        print("Stlačenie na mySublayer")
        // Môžeme vrátiť nil, ak nechceme, aby tento pohľad ďalej spracovával,
        // alebo volať super.hitTest(point, with: event) ak chceme zachovať štandardné správanie.
    }
    
    // Povolenie štandardného `hitTest` na spracovanie ostatných prípadov
    return super.hitTest(point, with: event)
}

Príklad použitia konverzie súradníc v handleri gest:

// V prispôsobenom `UIView` s pripojeným `UITapGestureRecognizer`
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    let tapLocationInView = sender.location(in: self)
    // Konverzia miesta dotyku z súradníc pohľadu do súradníc podvrstvy
    let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
    // Kontrola, či je bod vo vnútri hraníc podvrstvy
    if mySublayer.contains(tapLocationInSublayer) {
        print("Stlačenie na mySublayer")
        // Vykonajte akcie spojené so stlačením na podvrstve
    }
}