Middle
Wie erkennt man, ob der Benutzer auf eine Ebene (Layer) in der Anwendung geklickt hat?
sobes.tech KI
Antwort von AI
Um CALayer-Touch kann auf verschiedene Weisen erkannt werden:
-
Verwendung von
hitTest(_:event:)im View:UIViewhat die MethodehitTest(_:with:), die rekursiv durch die Hierarchie der Subviews geht und die tiefste Ansicht zurückgibt, die den Punkt enthält.- Diese Methode berücksichtigt standardmäßig die mit den Views verbundenen Layer.
- Man kann
hitTest(_:with:)in einer benutzerdefinierten Ansicht überschreiben, um eine detailliertere Kontrolle zu haben oder um Touches direkt auf Sub-Layern zu behandeln, die nicht mit Views verbunden sind.
-
Koordinaten mit
converttransformieren:- Beim Empfang eines Touch-Events (z.B. in
UIView-Methoden) hat man die Koordinaten des Touches relativ zum Fenster (UIWindow) oder zur Ansicht. - Um zu bestimmen, ob der Touch auf einen bestimmten Layer gefallen ist, muss man diese Koordinaten in das Koordinatensystem dieses Layers umrechnen.
- Dafür werden die Methoden
convert(_:from:)oderconvert(_:to:)vonCALayerverwendet. - Nach der Umrechnung kann man prüfen, ob der Punkt innerhalb der Grenzen des Layers (
bounds) liegt oder spezifischere Prüfungen wiecontains(_:)verwenden.
- Beim Empfang eines Touch-Events (z.B. in
-
UITapGestureRecognizeran die Ansicht anhängen:- Man kann einen
UITapGestureRecognizeran dieUIViewanhängen, die mit dem Layer verbunden ist. - Im Gesten-Handler erhält man die Position des Touches relativ zur Ansicht.
- Dann kann man die Koordinatenumwandung (Punkt 2) verwenden, um zu prüfen, ob der Touch innerhalb des Layers oder seiner Sub-Layers liegt.
- Man kann einen
-
Erstellen einer
UIViewfür jeden interaktiven Layer:- Wenn Sie Layer haben, die interaktiv sein sollen, ist eine einfache Methode, für jeden Layer eine
UIViewzu erstellen. - Positionieren und anpassen Sie die Größe der
UIView, um mit dem Layer übereinzustimmen. - Fügen Sie Gesten-Handler (
UITapGestureRecognizer) hinzu oder überschreiben Sie Methoden zur Touch-Verarbeitung (touchesBegan,touchesEndedetc.) in dieser Ansicht. - Dies ist die idiomatischste Methode, um Benutzereingaben in UIKit zu verarbeiten, da
UIViewdafür speziell gemacht ist.
- Wenn Sie Layer haben, die interaktiv sein sollen, ist eine einfache Methode, für jeden Layer eine
Beispiel für die Verwendung von hitTest in UIView:
// In einer benutzerdefinierten UIView
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
// Punkt in die Koordinaten der Sublayer umrechnen
let pointInLayer = mySublayer.convert(point, from: layer!)
// Prüfen, ob der Punkt innerhalb der Grenzen der Sublayer liegt
if mySublayer.contains(pointInLayer) {
// Wenn der Punkt innerhalb der Sublayer liegt, kann man diese Ansicht oder eine andere zurückgeben
// oder die notwendigen Aktionen ausführen.
// In diesem Fall bestimmen wir, dass der Touch "auf" der Sublayer war.
print("Touch auf mySublayer")
// Man kann nil zurückgeben, wenn diese Ansicht den Touch nicht weiter verarbeiten soll, oder super.hitTest, um das Standardverhalten zu behalten.
}
// Standardmäßiges hitTest-Verhalten zulassen
return super.hitTest(point, with: event)
}
Beispiel für die Verwendung der Koordinatenumwandlung im Gesten-Handler:
// In einer benutzerdefinierten UIView mit angehängtem UITapGestureRecognizer
@objc func handleTap(_ sender: UITapGestureRecognizer) {
let tapLocationInView = sender.location(in: self)
// Koordinaten des Taps in die Koordinaten der Sublayer umrechnen
let tapLocationInSublayer = mySublayer.convert(tapLocationInView, from: layer!)
// Prüfen, ob der Punkt innerhalb der Grenzen der Sublayer liegt
if mySublayer.contains(tapLocationInSublayer) {
print("Touch auf mySublayer")
// Aktionen im Zusammenhang mit dem Touch auf der Sublayer ausführen
}
}