2012-03-07 12 views
2

私は1本​​の指で回転を処理するカスタムUIGestureRecognizerを書いています。 Apples UIRotationGestureRecognizerとまったく同じように動作し、同じ値を返すように設計されています。カスタムUIGestureRecognizerの速度を実装する

ここで速度を実装したいと思いますが、Appleがジェスチャ認識器の速度をどのように定義して計算するのか分かりません。 誰もAppleがUIRotationGestureRecognizerでこれをどのように実装しているのか考えていますか?

+1

私はそれがtouhcesMovedとNSTimerを使って計算すると信じています。私は一度試しましたが、良い結果を達成するのは非常に難しいです。しかし、私はこれが行く方法だと思う。 –

答えて

4

最後のタッチ位置とそのタイムスタンプの参照を保持する必要があります。あなたの速度基準のいくつかの種類を与える必要があり

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

    last_timestamp = CFAbsoluteTimeGetCurrent(); 

    UITouch *aTouch = [touches anyObject]; 
    last_position = [aTouch locationInView: self]; 
} 


-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    double current_time = CFAbsoluteTimeGetCurrent(); 

    double elapsed_time = current_time - last_timestamp; 

    last_timestamp = current_time; 

    UITouch *aTouch = [touches anyObject]; 
    CGPoint location = [aTouch locationInView:self.superview]; 

    CGFloat dx = location.x - last_position.x; 
    CGFloat dy = location.y - last_position.y; 

    CGFloat path_travelled = sqrt(dx*dx+dy*dy); 

    CGFloat sime_kind_of_velocity = path_travelled/elapsed_time; 

    NSLog (@"v=%.2f", sime_kind_of_velocity); 

    last_position = location; 
} 

この:

double last_timestamp; 
CGPoint last_position; 

次に、あなたのような何かを行うことができます。

+4

ちょうど注意:CFAbsoluteTimeGetCurrent()の代わりにevent.timestampまたはtouch.timestampのプロパティを使用するほうが正確です。 –

関連する問題