Gesture Recognizer — was es ist, Touch-Handling in iOS

Autor: IT Sectr Veröffentlicht: 2026-02-27 Lesezeit: 8 Min.
Gesture Recognizer ist eine Abstraktion in UIKit, die eine Sequenz von Benutzerberührungen in eine erkannte Geste umwandelt: Tippen, Wischen, langes Drücken, Zupfen oder Drehen. Anstatt Koordinaten manuell in touchesBegan/touchesMoved-Methoden zu verfolgen, fügt der Entwickler ein fertiges UIGestureRecognizer-Objekt zu UIView hinzu und implementiert eine Aktionsmethode. Laut Apple Developer Documentation unterstützt UIGestureRecognizer 7 integrierte Unterklassen, die 95% der typischen Gesten in mobilen Anwendungen abdecken.

Wichtige Punkte

  • UIGestureRecognizer ist eine abstrakte UIKit-Klasse zum Erkennen von Berührungsmustern: Taps, Wischgesten, Zupfen, Drehungen und langes Drücken.
  • 7 integrierte Unterklassen: UITapGestureRecognizer, UISwipeGestureRecognizer, UIPinchGestureRecognizer, UIRotationGestureRecognizer, UILongPressGestureRecognizer, UIPanGestureRecognizer, UIScreenEdgePanGestureRecognizer.
  • Jeder Recognizer hat einen Zustand (possible, began, changed, ended, cancelled, failed), der sich mit den Fingerbewegungen aktualisiert.
  • Zur Konfliktlösung zwischen Gesten wird die Methode require(toFail:) verwendet, die die Erkennungspriorität festlegt.
  • Gesture Recognizer arbeitet mit UIKit und UIViewRepresentable in SwiftUI, aber natives SwiftUI verwendet Gestenmodifikatoren.

Was ist Gesture Recognizer?

UIGestureRecognizer ist eine abstrakte Basisklasse in UIKit, die den Gestenerkennungsprozess in separate Objekte zerlegt. Jede Unterklasse behandelt einen Gestentyp: UITapGestureRecognizer behandelt einen Tap mit einer bestimmten Anzahl von Berührungen, UISwipeGestureRecognizer behandelt einen Wisch in eine bestimmte Richtung. Der Entwickler fügt den Recognizer über die Methode addGestureRecognizer(:) zu UIView hinzu, und UIKit verfolgt automatisch Berührungen, aktualisiert den Zustand und ruft bei Erkennung eine Aktion auf.

Vor UIGestureRecognizer (iOS 3.2, 2010) überschrieben Entwickler UIResponder-Methoden — touchesBegan, touchesMoved, touchesEnded — und analysierten manuell die Berührungsverläufe. Dies führte zu Code-Duplizierung und Fehlern bei der Verarbeitung gleichzeitiger Berührungen. Apple kapselte diese Logik in UIGestureRecognizer und fügte Unterstützung für Multitouch, Gestenabbruch und gleichzeitigen Betrieb mehrerer Recognizer auf einer View hinzu.

Laut WWDC-Sitzungen verarbeitet Gesture Recognizer bis zu 11 gleichzeitige Berührungen auf dem iPad und 5 auf dem iPhone. Bei IT Sectr verwenden wir UIGestureRecognizer als Standardmethode zur Behandlung von Benutzereingaben in allen UIKit-Projekten — dies beseitigte Fehler im Zusammenhang mit manueller touchesBegan-Verfolgung.

Zustände von UIGestureRecognizer

Jeder UIGestureRecognizer durchläuft 7 mögliche Zustände, die im Enum UIGestureRecognizer.State definiert sind. Diese Zustände spiegeln den Erkennungslebenszyklus wider: von der Berührungserkennung bis zum Abschluss oder Abbruch. Das Verständnis der Zustände ist entscheidend für die Implementierung benutzerdefinierter Recognizer und das Debuggen von Konflikten.

Zustand Bedeutung Wann er auftritt
.possible Anfangszustand, Geste noch nicht erkannt Direkt nach dem Hinzufügen zu einer View
.began Geste erkannt und beginnt ausgeführt zu werden Bei erster Fingerbewegung für pan/longPress
.changed Gestenparameter geändert (Koordinaten, Winkel) Bei jeder Fingerbewegung
.ended Benutzer hob Finger, Geste abgeschlossen Bei touchesEnded
.cancelled Geste durch System unterbrochen (Anruf, Ausrichtungsänderung) Bei touchesCancelled
.failed Geste gemäß Bedingungen nicht erkannt Bei touchesCancelled ohne Erkennung
.recognized Synonym für .ended; Geste erfolgreich erkannt Gleiches wie .ended

Diskrete Gesten (Tap, Swipe) wechseln von .possible direkt zu .ended oder .failed. Kontinuierliche Gesten (Pan, Pinch, Rotation, LongPress) durchlaufen .possible → .began → .changed (wiederholt) → .ended. In der Aktionsmethode prüfen Sie gestureRecognizer.state — dies ermöglicht die Unterscheidung von Beginn, Änderung und Ende einer Geste.

Gestenarten in iOS

UIKit bietet 7 integrierte UIGestureRecognizer-Unterklassen, die die meisten Interaktionsszenarien abdecken. Jede Unterklasse hat spezifische Einstellungen: numberOfTapsRequired für Tap, direction für Swipe, minimumPressDuration für langes Drücken.

  • UITapGestureRecognizer — erkennt einzelne und mehrfache Taps. Konfigurierbare Anzahl von Taps (numberOfTapsRequired) und Fingern (numberOfTouchesRequired). Wird für Buttons, Links, Elementauswahl verwendet.
  • UISwipeGestureRecognizer — erkennt einen Wisch in eine von vier Richtungen (right, left, up, down). Die Eigenschaft direction legt die Richtung fest; numberOfTouchesRequired die Anzahl der Finger.
  • UIPanGestureRecognizer — kontinuierliche Geste zum Ziehen. Die Methode translation(in:) gibt den Versatz vom Startpunkt zurück. Wird für Drag-and-Drop, Karussells, Pull-to-Refresh verwendet.
  • UIPinchGestureRecognizer — Zwei-Finger-Skalierung. Die Eigenschaft scale spiegelt den aktuellen Skalierungsfaktor wider. Ausführlich im Artikel Pinch-to-Zoom beschrieben.
  • UIRotationGestureRecognizer — Zwei-Finger-Drehung. Die Eigenschaft rotation speichert den Winkel im Bogenmaß. Wird zum Drehen von Bildern, Karten, Leinwänden verwendet.
  • UILongPressGestureRecognizer — langes Drücken. Parameter: minimumPressDuration (Sekunden), allowableMovement (Pixel). Wird für Kontextmenüs, Elementziehen verwendet.
  • UIScreenEdgePanGestureRecognizer — Wischen vom Bildschirmrand. Die Eigenschaft edges gibt an, welcher Rand verfolgt wird. Wird für Navigationsgesten, Benachrichtigungsfelder verwendet.

Für benutzerdefinierte Gesten (z. B. Zeichnen eines Zickzacks) wird eine UIGestureRecognizer-Unterklasse erstellt, die touchesBegan, touchesMoved, touchesEnded überschreibt und den Zustand aktualisiert. Apple empfiehlt, wo möglich integrierte Klassen zu verwenden — sie sind optimiert und interagieren korrekt miteinander.

Konfliktlösung zwischen Gesten

Wenn mehrere UIGestureRecognizer auf einer UIView verwendet werden (z. B. Tap und Doppeltap), tritt ein Erkennungskonflikt auf: Bei einem Doppeltap feuert zuerst der einfache Tap. Apple stellt die Methode require(toFail:) zur Verfügung, die die Erkennung einer Geste verzögert, bis eine andere fehlschlägt.

Der Mechanismus funktioniert so: Durch Aufruf von tapRecognizer.require(toFail: doubleTapRecognizer) legen Sie fest, dass tapRecognizer nur dann in den Zustand .recognized übergeht, wenn doubleTapRecognizer in .failed endet. Dies fügt eine Verzögerung von ~0,3 Sekunden vor der Ausführung des einfachen Taps hinzu — der Benutzer tippt zweimal und der erste Tap wird ignoriert. Ein alternativer Ansatz ist der Delegat UIGestureRecognizerDelegate mit der Methode gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:), die gleichzeitige Erkennung erlaubt (z. B. Pan + Pinch für eine Karte).

Laut WWDC 2020 hängen etwa 15% der Fehler in UIKit-Anwendungen mit falscher Konfiguration von Gestenkonflikten zusammen. Bei IT Sectr haben wir den Ansatz standardisiert: Jeder Bildschirm hat ein Gestenschema mit require(toFail:)-Prioritäten — dies beseitigte Doppeltap-Fehler vollständig.

Swift-Codebeispiele

Beispiel 1: UITapGestureRecognizer — Tap auf Bild

Fügt einen Einfach-Tap-Handler zu UIImageView hinzu. Bei Berührung ändert sich die Deckkraft des Bildes — ein einfaches Beispiel, das die Bindung einer Geste an eine View zeigt.

swift
import UIKit

class ImageViewController: UIViewController {

    @IBOutlet private var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let tap = UITapGestureRecognizer(
            target: self,
            action: #selector(handleTap(_:))
        )
        tap.numberOfTapsRequired = 1
        imageView.addGestureRecognizer(tap)
        imageView.isUserInteractionEnabled = true
    }

    @objc private func handleTap(_: UITapGestureRecognizer) {
        UIView.animate(withDuration: 0.2) {
            self.imageView.alpha = self.imageView.alpha == 1.0 ? 0.5 : 1.0
        }
    }
}

Wichtiger Punkt: isUserInteractionEnabled auf UIImageView ist standardmäßig false — ohne dieses Flag erhält Gesture Recognizer keine Berührungen. Bei UIView und UIButton ist dieses Flag standardmäßig aktiviert. Die Aktionsmethode akzeptiert einen UITapGestureRecognizer-Parameter, über den location(in:) zur Bestimmung der Tap-Koordinaten abgerufen werden kann.

Beispiel 2: UISwipeGestureRecognizer — Wischen zur Navigation

Implementiert einen Wisch nach links, um zum vorherigen Bildschirm zurückzukehren. Zeigt die Richtungskonfiguration und die Bindung der Geste an die Root-View des Controllers.

swift
import UIKit

class DetailViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let swipeLeft = UISwipeGestureRecognizer(
            target: self,
            action: #selector(handleSwipe(_:))
        )
        swipeLeft.direction = .left
        view.addGestureRecognizer(swipeLeft)
    }

    @objc private func handleSwipe(_: UISwipeGestureRecognizer) {
        navigationController?.popViewController(animated: true)
    }
}

UISwipeGestureRecognizer ist eine diskrete Geste: Sie wechselt sofort nach Erkennung in .recognized, ohne zwischengeschaltete .changed-Zustände. Daher muss der Zustand in der Aktion nicht geprüft werden — die Geste wird entweder erkannt (Aktion feuert) oder nicht. Die Eigenschaft direction akzeptiert einen von vier Werten: .left, .right, .up, .down. Zur Unterstützung mehrerer Richtungen erstellen Sie separate Recognizer für jede.

Beispiel 3: Gestenkombination mit require(toFail:)

Zeigt, wie Einfach- und Doppeltap auf einer View ohne Konflikt konfiguriert werden. Der Doppeltap-Recognizer hat Priorität — der einfache Tap feuert nur, wenn der Doppeltap nicht erkannt wird.

swift
import UIKit

class TapViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let singleTap = UITapGestureRecognizer(
            target: self,
            action: #selector(handleSingleTap)
        )
        singleTap.numberOfTapsRequired = 1

        let doubleTap = UITapGestureRecognizer(
            target: self,
            action: #selector(handleDoubleTap)
        )
        doubleTap.numberOfTapsRequired = 2

        singleTap.require(toFail: doubleTap)

        view.addGestureRecognizer(singleTap)
        view.addGestureRecognizer(doubleTap)
    }

    @objc private func handleSingleTap() {
        print("Single tap — after 0.3s delay")
    }

    @objc private func handleDoubleTap() {
        print("Double tap — instant")
    }
}

Ohne require(toFail:) feuert bei einem Doppeltap zuerst handleSingleTap, dann handleDoubleTap — dies beeinträchtigt die UX. Mit require(toFail:) wartet der einfache Tap ~0,3 Sekunden, um sicherzustellen, dass kein zweiter Tap folgt. Bei IT Sectr wird dieses Muster in Bildeditoren und Galerien verwendet, wo ein Doppeltap zoomt und ein einfacher Tap ein Element auswählt.

Häufig gestellte Fragen

Kann ich mehrere Gesture Recognizer auf einer View verwenden?

Ja, UIView unterstützt mehrere UIGestureRecognizer-Instanzen gleichzeitig. Zur Konfliktlösung verwenden Sie die Methode require(toFail:), die die Erkennungsreihenfolge festlegt. Für parallele Gestenoperationen (z. B. pan + pinch auf einer Karte) implementieren Sie die Delegatmethode gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:), die true zurückgibt.

Wie unterscheidet sich UIGestureRecognizer von touchesBegan?

UIGestureRecognizer ist eine hochrangige Abstraktion, die Berührungsmuster automatisch erkennt und Zustände verwaltet. touchesBegan ist eine niedrige UIResponder-Methode, die manuelle Koordinatenverfolgung, Timing und Berührungsabbruch erfordert. Gesture Recognizer ist einfacher, zuverlässiger und für Standardgesten vorzuziehen; touchesBegan ist nur für benutzerdefinierte Grafiken gerechtfertigt.

Funktioniert Gesture Recognizer in SwiftUI?

Natives SwiftUI verwendet Modifikatoren: onTapGesture, onLongPressGesture, DragGesture, MagnificationGesture, RotationGesture. Dies sind deklarative Analoga von UIGestureRecognizer, die in die SwiftUI-Hierarchie integriert sind. Bei Bedarf kann ein UIKit-Recognizer über UIViewRepresentable eingebunden werden, aber Apple empfiehlt die Verwendung nativer SwiftUI-Gesten.

Zusammenfassung

  • UIGestureRecognizer ist eine UIKit-Abstraktion zur Zerlegung der Gestenerkennungslogik in separate Objekte mit automatischer Zustandsverwaltung.
  • 7 integrierte Unterklassen decken 95% der typischen Gesten ab: Tap, Swipe, Pan, Pinch, Rotation, Long Press und Edge Swipe.
  • Jeder Recognizer durchläuft 7 Zustände — von .possible bis .ended/.failed, was eine präzise Verfolgung diskreter und kontinuierlicher Gesten ermöglicht.
  • Die Methode require(toFail:) löst Konflikte zwischen Gesten auf einer View durch Festlegung der Erkennungspriorität.
  • SwiftUI verwendet deklarative Gestenmodifikatoren, aber UIKit-Recognizer sind über UIViewRepresentable verfügbar.
  • Gesture Recognizer ist für UIKit-Projekte obligatorisch; touchesBegan ist nur für benutzerdefinierte Zeichnungen und niedrige Grafiken gerechtfertigt.
  • Verwenden Sie require(toFail:) für Tap/Doppeltap-Paare und gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:) für parallele Gesten.

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch