2016-06-22 12 views
1

私はUIRotationGestureRecognizerのrotateView設定を持っています。意図どおりに動作しますが、ノッチ/ 90度単位で回転したいだけです。デフォルトの動作では、回転を使用して非常に細かく正確にすることができます。私はそれが4つの可能な位置の反対であることを望みます。スウィフト - ジェスチャーと回転の増分を90度回転します

私が直面している問題は、回転が1度しか起こらず、一方向にしか起こらないということです(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 
      }) 
     } 
    } 
} 

注意を私は機能が@IBActionである理由です、Interface Builderのから所望のビューにUIRotationGestureRecognizerを追加したこと。

出力:

enter image description here

関連する問題