Middle
Hoe kan worden vastgesteld of een gebruiker op een laag (layer) heeft geklikt?
sobes.tech AI
Antwoord van AI
Je kunt hit testing gebruiken: bepalen op welk laag de aanraking precies heeft plaatsgevonden. Core Animation biedt hiervoor twee methoden:
-
hitTest(_:):- Controleert of het punt binnen de grenzen van het laag of een van zijn onderlagen ligt.
- Geeft de diepste onderlaag (of het laag zelf) terug die het punt bevat.
- Neemt
isHidden = truein overweging.
-
contains(_:):- Controleert alleen of het punt binnen de grenzen van het eigen laag ligt.
- Neemt de hiërarchie van onderlagen niet in overweging.
- Neemt
isHiddenniet in overweging.
Meestal wordt hitTest gebruikt, omdat het preciezer is voor het bepalen van interactiviteit.
Voorbeeld van gebruik van hitTest in een touch-handler:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let locationInView = touch.location(in: view)
// Converteer het punt van view-coördinaten naar laag-coördinaten
let locationInLayer = myLayer.convert(locationInView, from: view.layer)
// Voer de hit test uit
if let hitLayer = myLayer.hitTest(locationInLayer) {
if hitLayer === myLayer {
// Exact op myLayer getikt
print("myLayer is getikt")
} else {
// Op een sublaag binnen myLayer getikt
print("Sublaag binnen myLayer is getikt")
// Identificatie van de sublaag kan extra controles vereisen
}
} else {
// Buiten myLayer en zijn sublagen getikt
print("Buiten myLayer getikt")
}
}
Belangrijke punten:
- De coördinaten van de aanraking (
location(in:)) zijn altijd gekoppeld aanUIView. Ze moeten worden omgezet naar het coördinatensysteem van de laag (convert(_, from:)ofconvert(_, to:)). - De methode
hitTest(_:)werkt met punten in het coördinatensysteem van de aanroepende laag (myLayer.hitTest(locationInLayer)). - Als de laag onzichtbaar is (
alpha = 0ofisHidden = true), zalhitTestnilteruggeven.containsgeefttrueterug als het punt binnen de grenzen ligt, ongeacht de zichtbaarheid. - Voor complexe hiërarchieën van lagen kan een recursieve zoekopdracht of het controleren van de geretourneerde
hitLayernodig zijn.