2016-06-22 126 views
1

我有一個rotateView設置與UIRotationGestureRecognizer。按預期工作,但是我只想旋轉90度的凹槽/增量。默認行爲允許您在旋轉時非常精細和精確。我希望它是相反的,只有4個可能的位置。Swift - 旋轉90度的手勢和旋轉增量

我下面的代碼儘可能接近我可以得到的,但是我面臨的問題是旋轉只發生一次,而且只能向一個方向旋轉(即向右旋轉,即使我將2個手指向左旋轉)。

我的代碼

func rotatedView(recognizer:UIRotationGestureRecognizer){ 
    let pi = CGFloat(M_PI) 
    rotateView.transform = CGAffineTransformMakeRotation(pi/2) 
    recognizer.rotation = 0 
    if recognizer.state == UIGestureRecognizerState.Changed { 
     print("rotation began") 
    } 
    else { 
     print("rotation ended") 
    } 
} 

如何修改上面的代碼,允許90度旋轉的增量基於手勢任一方向?

回答

1

我通過如下實現它實現了這個:

@IBAction func handleRotation(_ recognizer: UIRotationGestureRecognizer) { 
    if let recognizerView = recognizer.view { 
     recognizerView.transform = recognizerView.transform.rotated(by: recognizer.rotation) 
     recognizer.rotation = 0 

     let radians:Double = atan2(Double(recognizerView.transform.b), Double(recognizerView.transform.a)) 
     let degrees = radians * Double((180/Float.pi)) 

     if recognizer.state == .ended || recognizer.state == .cancelled { 
      var degreeToAnimate:CGFloat = 0 

      switch degrees { 
      case -45...45: 
       print("the default value 0, no need to any assign...") 
      case 46...135: 
       degreeToAnimate = CGFloat(M_PI_2) 
      case 136...180, -180 ... -136: 
       degreeToAnimate = CGFloat(M_PI) 
      case -135 ... -46: 
       degreeToAnimate = CGFloat(-M_PI_2) 
      default: 
       print("!") 
      } 

      UIView.animate(withDuration: 0.3, delay: 0.0, usingSpringWithDamping: 0.6, initialSpringVelocity: 1.0, options: .curveEaseIn, animations: { 
       recognizerView.transform = CGAffineTransform(rotationAngle: degreeToAnimate) 
      }, completion: { _ in 
       recognizer.rotation = 0 
      }) 
     } 
    } 
} 

注意,我從界面生成器所需的視圖中添加的UIRotationGestureRecognizer,這就是爲什麼功能是@IBAction

輸出:

enter image description here