8

UIImageViewユーザーがタッチして時計回りに指を動かしたときに反時計回りに回転するようにアニメーション化しようとしています。
基本的に、タッチが終了したらUIImageViewを元の位置に戻し、反時計回りに移動する必要があります。

私が抱えている問題は、角度 (度単位) が 180 を超えるたびに、画像が時計回りに回転して元の位置に戻ることです。どうやら最短ルートで戻るようです。角度が 179 度以下の場合、画像は反時計回りに回転します (必要なもの)。

これらのコードの両方を試してみましたが、同じように動作します。助言がありますか?

注: ここで angle 変数は double であり、ゼロに初期化されており、コード全体で 0 のままです

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self handleObject:touches withEvent:event isLast:YES];

    /* this doesn't make rotation counter clockwise for rotations greater than 180 */
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve: UIViewAnimationCurveLinear];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationRepeatCount:1]; 
    CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
    circle1ImgVw.transform = CGAffineTransformRotate(transform, angle);
    // ends animation
    [UIView commitAnimations];


    /* this doesn't make rotation counter clockwise for rotations greater than 180 */
    [UIView animateWithDuration:1.0 animations:^{
            circle1ImgVw.transform = CGAffineTransformMakeRotation(angle);
        }];
} 

この投稿を調べてみましたが、いくつか問題があります

  • アニメーションが完了したら、画像をタッチして回転させることができなくなりました
  • それは常に時計回りの方向にアニメーション化され、ユーザーが画像の回転を終了した時点から反時計回りにスムーズに移動する方法を理解できませんでした。
4

2 に答える 2

3

同様の問題がありました。受け入れられた回答を確認してください。役立つ場合があります。

180度を超える角度でUIViewを時計回りに回転させます


コメントに応じて、これが役立つかもしれません:

私のコードでは、実際に使用しています

rotationAnimation.fromValue
rotationAnimation.toValue

それ以外の

rotationAnimation.byValue.

toValue が fromValue より小さい場合、回転は常に反時計回りになります。値が正か負かは問題ではなく、それらの間の関係だけです。

開始角度を把握し、回転させたい方向を把握し、終了角度を把握します。反時計回りにしたい場合は、開始角度よりも小さいことを確認してください。これは、時計の針を時計回りに 12:00 から現在の時間までアニメーション化するために使用するコードです。

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self updateClockArmAngle];
}

- (void)updateClockArmAngle
{
    // Get the time
    NSDate *date = [NSDate date];
    NSCalendar* calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    [calendar setTimeZone:[NSTimeZone timeZoneWithName:@"America/Toronto"]];
    NSDateComponents* components = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:date];

    CGFloat hour = [components hour];
    CGFloat angle = (hour/24.0)*(2*M_PI);

    CGFloat minute = [components minute];
    angle += (minute/(24*60))*(2*M_PI);

    [self rotateViewAnimated:self.clockArm withDuration:1.5 byAngle:angle];
}


- (void) rotateViewAnimated:(UIView*)view
               withDuration:(CFTimeInterval)duration
                    byAngle:(CGFloat)angle
{    
    CABasicAnimation *rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.fromValue = 0;
    rotationAnimation.toValue = [NSNumber numberWithFloat:angle];
    rotationAnimation.duration = duration;
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [rotationAnimation setRemovedOnCompletion:NO];
    [rotationAnimation setFillMode:kCAFillModeForwards];
    [view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}
于 2012-12-09T20:52:20.530 に答える
0

completion:私が使用した手法は、回転角度を 2 で割って、回転を のパラメータでリンクされた 2 つの別々のアニメーションに分けることですanimateWithDuration:delay:options:animations:completion:。ただし、ビューは現在の位置に回転されているため、ゼロから反時計回りに回転しようとするのではなく、その位置から開始して「回転を解除」してゼロに戻す必要があります。

于 2012-12-11T20:48:22.987 に答える