2017-06-10 3 views
0

In modernen Benutzeroberflächen unter iOS ist es oft nützlich, mehrere UIGestureRecognizer in einer einzigen Ansicht zu implementieren, um ein realistischeres Verhalten der angezeigten Objekte zu ermöglichen, die die reale Welt modellieren.Mehrere UIGestureRecognizer gleichzeitig verwenden wie UIRotationGestureRecognizer & UIPanGestureRecognizer in Swift 3

Zum Beispiel möchten Sie vielleicht in der Lage sein, eine Ansicht um den Bildschirm zu ziehen, aber auch mit zwei Fingern zu drehen.

Die UIGestureRecognizerDelegate bietet eine optionale Funktion shouldRecognizeSimultaneouslyWith für diesen Zweck. true die Rückkehr vermeidet nur eine Geste Effekt zu einer Zeit mit:

// MARK: - UIGestureRecognizerDelegate 
extension GestureController: UIGestureRecognizerDelegate { 

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     return true 
    } 
} 

Wenn jedoch mehrere Gesten recognisers aktiv sind, vor allem UIRotationGestureRecognizer kann es frustrierend sein, unerwartet ständig als die Handler sie überschreiben verhalten um die Ansicht zu finden.

Wie können mehrere Gestenerkenner implementiert werden, um ein reibungsloses Verhalten zu gewährleisten?

Antwort

2

Der Schlüssel zum gleichzeitigen Implementieren mehrerer Gestenerkenner ist ihre CGAffineTransforms zu ändern, anstatt sie zu überschreiben.

Apple > Documentation > Core Graphics > CGAffineTransform:

Beachten Sie, dass Sie nicht in der Regel brauchen affin erstellen verwandelt direkt. Wenn Sie beispielsweise nur ein Objekt zeichnen möchten, das skaliert oder gedreht ist, ist es nicht erforderlich, dafür eine affine Transformation zu erstellen. Der direkteste Weg, um Ihre Zeichnung zu bearbeiten - ob durch Bewegung, Skalierung oder Drehung - ist, die Funktionen translateBy (x: y :) , scaleBy (x: y :) oder rotieren (by :) , jeweils. Sie sollten im Allgemeinen nur eine affine Transformation erstellen, wenn Sie sie später erneut verwenden möchten.

Weiterhin, wenn Änderungen detektiert werden, nach der Übersetzung der Anwendung ist es wichtig, den Wert des Senders, zurückzusetzen, so dass die Übersetzungen nicht jedes Mal Verbindung sie erkannt werden.

Zum Beispiel:

@IBAction func rotateAction(_ sender: UIRotationGestureRecognizer) { 
    guard let view = sender.view else { return } 

    switch sender.state { 
    case .changed: 
     view.transform = view.transform.rotated(by: sender.rotation) 
     sender.rotation = 0 
    default: break 
    } 
} 

und

@IBAction func panAction(_ sender: UIPanGestureRecognizer) { 
    guard let view = sender.view else { return } 

    switch sender.state { 
    case .changed: 
     let translationX = sender.translation(in: view).x 
     let translationY = sender.translation(in: view).y 

     view.transform = view.transform.translatedBy(x: translationX, y: translationY) 
     sender.setTranslation(CGPoint.zero, in: view) 
    default: break 
    } 
} 
Verwandte Themen