2017-03-21 7 views
2

Ich versuche, ein ImageView zu drehen, das ich abhängig von der X-Koordinate habe, die es ist. Grundsätzlich möchte ich eine Drehung von 0º haben, wenn x = 300 und eine Drehung von 180º, wenn x = 190.Drehen von ImageView mit UIPanGestureRecognizer- Swift 3

Ich musste den UIPanGestureRecognizer programmatisch programmieren. Hier ist der Code, den ich zur Zeit gerade jetzt:

@objc func personDrag(recognizer: UIPanGestureRecognizer) { 

    let rotationSub: CGFloat = 1 

    let translation = recognizer.translation(in: rView) 
    if let view = recognizer.view { 
     view.center = CGPoint(x:view.center.x + translation.x, y:view.center.y + translation.y) 
     view.transform = view.transform.rotated(by: CGFloat.pi - rotationSub) 
    } 
    recognizer.setTranslation(CGPoint.zero, in: rView) 

} 

, ich würde die Rotation Grad von 1, um zu versuchen zu ändern, jedes Mal wenn sie verrissen, aber es funktioniert nicht wirklich/Sinn machen. Jede Hilfe wäre willkommen. Ich danke dir sehr!

Cheers, Theo

+0

Können Sie erklären, was man unter 'es funktioniert nicht'? – dmorrow

+0

@dmorrow es dreht sich nur super schnell, wenn ich die Bildansicht über den Bildschirm bewegen, anstatt den Grad der Drehung abhängig von der x-Koordinate zu ändern. Klärt das? Vielen Dank! –

Antwort

3

Sie Ihre Implementierung darauf aufbauen können:

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var imageview: UIImageView! 

    private var currentRotation: Rotation = .none 

    /* Certain rotation points (rotation of 0º when x = 300 and a rotation of 180º when x = 190) */ 
    enum Rotation { 
     case none, xPoint190, xPoint300 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) 
     imageview.addGestureRecognizer(gestureRecognizer) 
     imageview.isUserInteractionEnabled = true 
    } 

    @IBAction func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) { 
     guard gestureRecognizer.state == .began || gestureRecognizer.state == .changed else { 
      return 
     } 

     guard let imgView = gestureRecognizer.view else { 
      return 
     } 

     let translation = gestureRecognizer.translation(in: self.view) 
     imgView.center = CGPoint(x: imgView.center.x + translation.x, y: imgView.center.y + translation.y) 
     gestureRecognizer.setTranslation(CGPoint.zero, in: self.view) 

     let angle: CGFloat = self.degreesToRadians(180.0) 

     /* After reaching x point case - rotating and setting rotation occured to prohibit further rotation */ 

     if imgView.layer.frame.origin.x <= 190, currentRotation != .xPoint190 { 

     imgView.transform = imgView.transform.rotated(by: angle) 
     currentRotation = .xPoint190 

    } else if imgView.layer.frame.origin.x >= 300, currentRotation != .xPoint300 { 

     imgView.transform = imgView.transform.rotated(by: angle) 
     currentRotation = .xPoint300 
    } 


    private func degreesToRadians(_ deg: CGFloat) -> CGFloat { 
     return deg * CGFloat.pi/180 
    } 
} 
+0

ich denke, du bist verwirrt. Ich möchte, dass sich das Bild dreht, wenn ich es über den Bildschirm ziehe. –

+1

@TheoStrauss hat meine Antwort bearbeitet. Das Ziehen wurde implementiert, wenn die Bildansicht bestimmte x Punkte erreicht, dreht es sich. Ich hoffe es ist was du willst;] –

+0

oh mein Gott, das ist großartig. Ich brauche etwas Zeit, um zu verdauen und zu implementieren und erkundige mich zurück mit dir. Ich gebe dir jetzt das Häkchen! –

Verwandte Themen