2011-02-01 1 views
3

基本的には、地球上に指を置いて、そのタイプの機能を回転させようとしています。iOS - スワイプW /ベロシティスワイプのアドバンスアニメーション

だから私は本当に行う必要があるのは、短いタイマーでスワイプし、速度の方向をつかむている(?500msの?)

だから、誰もがこのような何かを知っている

While(swiping) { 
    Get(pointTouched); 
    swipeDirection = Calc(direction); 
    swipeSpeed = Calc(speed); 

    FramesToPlay = swipeSpeed * ConstantAmount; 

    If(Direction == Backwards){ 
     FramesToPlay = FramesToPlay * -1; 
    } 

    Play(playAnimation, FramesToPlay); 

    wait(500ms); 
} 

ような何か?または私が一緒に畳むことができる作品?

アニメーションでは、このスワイプの詳細だけがわかりました。私はタッチを混乱させました。

+0

私はここにおり、私は非常に感謝している皆のコメントと回答を統合しようとしています。あなたの前のコメントについては、私は投票をして、助けてくれた人に何かを返すことができるように、私はちょっとしています。 – Mytheral

答えて

9

おそらくUIPanGestureRecognizervelocityInView:メソッドを使用できます。私はこれをテストしたが、それが動作するはずのように思えるしていない:

- (void)handlePanGesture:(UIPanGestureRecognizer *)pan 
{ 
    if (pan.state == UIGestureRecognizerStateEnded) 
    { 
     CGPoint vel = [pan velocityInView:self.view]; 
     [self doSpinAnimationWithVelocity:vel.x]; 
    } 
} 

また、pan.state == UIGestureRecognizerChangedは、あなたの世界は、指と一緒に回すことができたとき。

2

現在のUIViewのtouchesBeganおよびtouchesMovedデリゲートを使用します。これらの代理人はxyの場所とタイムスタンプを返します。タッチ間のピタゴラスの距離をデルタ時間で割って、タッチまたはスワイプの速度を推定し、atan2(dy、dx)から角度を取得することができます。複数のタッチイベントでこれを行うことで、返されるベロシティを平均化またはフィルタリングすることもできます。

1

私はそれをどうしたらいいですか?のサブクラスを作成します。このサブクラスの目的は、touchesBegan:withEvent:メソッドで受信した最初と最後のUITouchオブジェクトを覚えておくことです。それ以外のものはに転送されます。

認識機能がトリガーされると、認識機能はsenderパラメータとして渡されます。最初と最後のタッチオブジェクトを求めてから、locationInView:メソッドとtimestampプロパティを使用して、スワイプの速度(速度=距離の変化/時間の変化)を調べることができます。その後、別の場所で

@interface DDSwipeGestureRecognizer : UISwipeGestureRecognizer 

@property (nonatomic, retain) UITouch * firstTouch; 
@property (nonatomic, retain) UITouch * lastTouch; 

@end 

@implementation DDSwipeGestureRecognizer 
@synthesize firstTouch, lastTouch; 

- (void) dealloc { 
    [firstTouch release]; 
    [lastTouch release]; 
    [super dealloc]; 
} 

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self setFirstTouch:[touches anyObject]]; 
    [super touchesBegan:touches withEvent:event]; 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self setLastTouch:[touches anyObject]]; 
    [super touchesEnded:touches withEvent:event]; 
} 

@end 

をあなたがしたい:

は、だから、このようなものになるだろう

DDSwipeGestureRecognizer *swipe = [[DDSwipeGestureRecognizer alloc] init]; 
[swipe setTarget:self]; 
[swipe setAction:@selector(swiped:)]; 
[myView addGestureRecognizer:swipe]; 
[swipe release]; 

そして、あなたの行動は何かのようになります:

- (void) swiped:(DDSwipeGestureRecognizer *)recognizer { 
    CGPoint firstPoint = [[recognizer firstTouch] locationInView:myView]; 
    CGPoint lastPoint = [[recognizer lastTouch] locationInView:myView]; 
    CGFloat distance = ...; // the distance between firstPoint and lastPoint 
    NSTimeInterval elapsedTime = [[recognizer lastTouch] timestamp] - [[recognizer firstTouch] timestamp]; 
    CGFloat velocity = distance/elapsedTime; 

    NSLog(@"the velocity of the swipe was %f points per second", velocity); 
} 

警告:コードはブラウザに入力され、コンパイルされません。警告実装者。

+0

私はスーパークラスコールのtouchesBeganとtouchesEndedがうまくいくかどうかわかりません。私はUIGestureRecognizersがレスポンダーチェーンに属していないと信じています。私は間違っているかもしれません。 – nico

+0

@nicoこれらは 'UIResponder'オブジェクトではありませんが、' UIGestureRecognizer'のドキュメンテーションは、これらがオーバーライドするメソッドであることははっきりしています。スワイプ認識プログラムの動作を変更したくないので、コールを「スーパー」に転送する必要があります。 –

+0

スワイプはワンタッチで構成されているので、リンゴはワンタッチが同じオブジェクトで何度も何度も繰り返されることを保証しているため、おそらく機能しません。したがって、 'distance'と' elapsedTime'の両方は0になります。 –

関連する問題