2016-10-12 1 views
0

ちょっと、画面上のホイールを回転させるUIGestureRecognizerを構築しようとしています。このようにそれを想像:ホイールを回して、それを紡績:iOS/Swift:スピン動作を検出するカスタムUIGestureRecognizer

enter image description here

つのジェスチャーを検出する必要があります。 私は、車輪を回転させたり回転させたりすることを認識するUIGestureRecognizerの構築を完了しました。スピンジェスチャーが発生したかどうかを検出するために、ホイールにUISwipeGestureRecognizerを追加することもできます。ユーザーは、まだ画面上で指で、パンの高速スワイプして除去した後、画面

  • の上にパンでホイールを回転させる

    1. :しかし、私はまた、このようになりますそのジェスチャが検出されるようにしたいです画面の指ホイールは、私はそれらを作るために

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

      を使用してみました

    をスピンなるように同時に動作するが、成功しない。また、両方のGestureRecognizersを記述するだけで仕事をしないと思う。

    私は助けていただきありがとうございます。ありがとう

  • +0

    回転のコードを共有できますか? –

    答えて

    2

    あなたの問題は、パンが始まると、タッチが終了するまでパンのジェスチャーとして認識され続けることになります。だから、あなたが把握する必要があるのは、パンが終わるときのベロシティです。ファンタジーにしたい場合、そのベロシティを、ビューの中心を基準にした点から垂線ベクトルに投影します。これはいくつかの三角法を必要としますが、私は正確に忘れてしまいますが、このように見えます。

    func pan(_ sender: UIPanGestureRecognizer) { 
         ... 
    
        if sender.state == .ended { 
         let loc = sender.location(in: sender.view) 
         let midpoint = CGPoint(x: sender.view!.bounds.width/2, y: sender.view!.bounds.height/2) 
         let v = sender.velocity(in: sender.view) 
         let p = CGPoint(x: midpoint.x - loc.x, y: midpoint.y - loc.y) 
    
         let angle = atan(p.y/p.x) 
         print(angle) 
         let vProjection = v.y * cos((CGFloat.pi/2 - angle)) + v.x * cos(angle) 
         print("moment: ", vProjection) 
    
         let torque = p.hypotenuse() * vProjection 
         wheel.rotate(with: torque) 
        } 
    } 
    
    extension CGPoint { 
        func hypotenuse() -> CGFloat { 
         return sqrt(self.x * self.x + self.y * self.y) 
        } 
    } 
    

    私は三角法の誤差があると思います。私はいくつかの図を描かなければならないだろうが、それは一般的な考えを与える。 wheel.rotate(トルク:CGFloat)は、レイヤの変形のアニメーションを実行して回転します。

    +0

    値はまだ正しくはありませんが、これはすでにうまく機能しています。アイデアは素晴らしいです。本当にありがとう! – Vincent

    +0

    あなたはおそらくちょうど速度でも大丈夫でしょう。私は数字をチェックしなかっただけで、私の限られた代数でそれをちょっと書きました。それがうまくいってうれしい! –

    関連する問題