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:
-
Použitie
hitTest(_:event:)v pohľade (View):UIViewmá metóduhitTest(_: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.
-
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:)aleboconvert(_:to:)CALayer. - Po konverzii môžete skontrolovať, či bod leží vo vnútri hraníc vrstvy (
bounds) alebo použiť špecifickejšie kontroly akocontains(_:).
- Pri zachytení udalosti dotyku (napríklad v metódach
-
Pripojenie
UITapGestureRecognizerk pohľadu:- Môžete pripojiť gest
UITapGestureRecognizerkUIView, 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.
- Môžete pripojiť gest
-
Vytvorenie
UIViewpre 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ť
UIViewv súlade s vrstvou. - Pripojte obslužné rutiny gest (
UITapGestureRecognizer) alebo prepíšte metódy spracovania udalostí dotyku (touchesBegan,touchesEndedatď.) v tomto pohľade. - Toto je najidiomatickejší spôsob spracovania používateľského vstupu v UIKit, pretože
UIViewje na to špeciálne určený.
- Ak máte vrstvy, ktoré majú byť interaktívne, najjednoduchší spôsob je vytvoriť pre každú takú vrstvu zodpovedajúci
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
}
}