1

複雑な問題があります。iOS用のツイスターゲームを作っています。ホイールの矢印を指でドラッグできます。ユーザーがスワイプしているときに回転させたくありません。

矢印をゆっくりと回転させると、ゆっくりと移動し、最後に停止するか、ユーザーができるだけ速くスワイプすると、矢印はできるだけ速く回転する必要があります。

現在、矢印をドラッグ可能にするこのコードがあります。

どうすればこのアニメーションを行うことができますか?

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    gestureStartPoint = [touch locationInView:self.view];

    CGPoint startPoint = CGPointMake(arrowImage.center.x, arrowImage.center.y);

    CGPoint endPoint = CGPointMake(gestureStartPoint.x, gestureStartPoint.y);

    angleStartVal = ((((atan2((endPoint.y - startPoint.y) , (endPoint.x - startPoint.x)))*180)/M_PI)+90);

    timerStart = CFAbsoluteTimeGetCurrent();

}

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

    UITouch *touch = [touches anyObject];
    CGPoint currentPosition = [touch locationInView:self.view];

    CGPoint startPoint = CGPointMake(arrowImage.center.x, arrowImage.center.y);
    CGPoint endPoint = CGPointMake(currentPosition.x, currentPosition.y);

    angleVal = ((((atan2((endPoint.y - startPoint.y) , (endPoint.x - startPoint.x)))*180)/M_PI)+90);
    arrowImage.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(angleVal));

     //NSLog(@"angle: %f",angleVal);

}

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

}
4

2 に答える 2

4

これを停止するまで減速させたい場合は、非表示の scrollView を制御することでこれを実装します。

スワイプするUIScrollViewとすでに減速しており、減速速度を制御できます。

VC はUIScrollViewDelegate、「無限スクロール ビュー」にする必要があります。つまり、一方の端までスクロールすると、デリゲートはそれをもう一方の端に戻します。

これで、回転角度の x 方向に contentOffset 量を適用できます。

0% オフセット = 0 回転 100% オフセット = 360 回転

これで、回転をアニメーション化しようとしているのではなく、scrollView のオフセットを取得し、それを回転として針に適用するだけです。

TBH、非表示にする必要さえありません。何も置かず、スクロールビューを針の上に配置するだけです。

すなわち

[--------SCROLL VIEW---------]  //scroll this
[--------NEEDLE VIEW---------]  //Use the scroll amount from the scroll view to apply rotation here.
[-COLORS and BODY PARTS VIEW-]  //Doesn't move
[-----VC  View---------------]  //Doesn't move

Apple は、いくつかの UI でこれと同様の手法を使用しています。

編集

自分の方法が機能するかどうかをテストするために、これを自分で作成しました。

UIViewController がこれを実行するための完全なコードを見ることができます...

UIScrollView をループしますが、減速を続けます

UIImageView、矢印が上向きの正方形のビューです。UIScrollViewには とまったく同じフレームがあり、その上UIImageViewに座っています。

于 2013-01-31T14:51:00.153 に答える
1

矢印の画像ビューを同時に動かして回転させるには、矢印の画像ビューをビューに埋め込み、あなたがやっているように CGAffineTransformMakeRotation を使用します。次に、矢印が埋め込まれているビューを移動し、同時に矢印のイメージビューを回転させます。

次に、人がスワイプするときに回転したり速く移動したりするには、velocityInView: を使用して UIPanGestureRecognizer を調べ、指の移動速度を確認し、それに応じてアニメーションを調整します。

 _panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
[self.someView addGestureRecognizer:_panGestureRecognizer];

-(void)handlePanFrom:(UIPanGestureRecognizer *)recognizer{
CGPoint translation = [recognizer translationInView:recognizer.view];
CGPoint velocity    = [recognizer velocityInView:recognizer.view];



if (recognizer.state == UIGestureRecognizerStateBegan) {
}
else if (recognizer.state == UIGestureRecognizerStateChanged) {
    CGPoint tempPoint;
    tempPoint = [recognizer locationInView:self.view];
    NSLog(@"point %f", tempPoint.y);
    NSLog(@"center %f", self.someview.center.y);

}
else if (recognizer.state == UIGestureRecognizerStateEnded) {
    CGPoint tempPoint;
    tempPoint = [recognizer locationInView:self.view];


}

}

于 2013-01-29T13:36:02.323 に答える