0

UIViewを回転させながらスライドさせようとしています。最終的な結果は、基本的にUIViewであり、画面を左に約70度回転し、端にぶつかり、右に約50度回転し、最終的に静止します(さらに数回ぐらついた後)。スライドさせて回転させることはできますが、2番目の回転をアニメートしようとすると(エッジに当たると)、フレームは元の値(画面の左側に戻る)に戻ります。UIViewがスライドした後、フレームを固定するにはどうすればよいですか?

[UIView animateWithDuration:.4 delay:0.0 
                    options:UIViewAnimationCurveEaseInOut
                 animations:^{
                     CGAffineTransform slideAndRotate = CGAffineTransformMakeTranslation(300, 0);
                     slideAndRotate = CGAffineTransformRotate(slideAndRotate, RADIANS(75));

                     self.ticketImageView.transform = slideAndRotate;                 
} completion:^(BOOL finished) {
    // set the frame to the location where it ended up
    NSLog(@"%@", NSStringFromCGRect(self.ticketImageView.frame));
    [UIView animateWithDuration:.35 
                          delay:0.05 
                        options:UIViewAnimationCurveEaseInOut 
     | UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                         CGAffineTransform rightAngle1 = 
                         CGAffineTransformRotate(CGAffineTransformIdentity, RADIANS(-45.0));
                         [[self ticketImageView] setTransform:rightAngle1];
    } completion:^(BOOL finished) {

    }];
4

2 に答える 2

1

最初のアニメーションブロックでは、平行移動と回転の両方を含む変換を作成しています。2番目のアニメーションブロックでは、回転を含み、平行移動を含まない変換を作成しています。したがって、2番目の変換にアニメートするときに、ビューは変換されなくなります。

オプションを使用したようですUIViewAnimationOptionBeginFromCurrentState。このオプションは、最初の変換スタックと2番目の変換スタックを作成すると思うかもしれませんが、そうではありません。オプションに関係なく、2番目の変換が最初の変換に置き換わります。

AUIViewには、その場所に影響を与える2つのプロパティがあります。1つはtransform、使用しているです。もう1つはcenterです。

通常、centerプロパティを使用してビューを移動し、プロパティを使用してビューtransformを回転および拡大縮小します。同じことをお勧めします。

ビューをもう数回ぐらつかせたいと言っているので、次のようなことを試してみることをお勧めします。

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

    [UIView animateWithDuration:0.4 animations:^{
        self.ticketImageView.center = CGPointMake(180, self.ticketImageView.center.y);
    }];

    [self wobbleWithAmount:0.4 direction:1];
}

- (void)wobbleWithAmount:(CGFloat)amount direction:(CGFloat)direction {
    [UIView animateWithDuration:amount animations:^{
        self.ticketImageView.transform = CGAffineTransformMakeRotation(amount * direction * M_PI * 0.5f);
    } completion:^(BOOL finished) {
        if (amount > 0.05f) {
            [self wobbleWithAmount:amount * 0.5f direction:-direction];
        } else {
            [UIView animateWithDuration:amount * 0.5f animations:^{
                self.ticketImageView.transform = CGAffineTransformIdentity;
            }];
        }
    }];
}
于 2012-07-18T22:36:47.507 に答える
0

2番目の変換を作成するときは、の代わりにrightAngle1を使用する必要があります。ID変換を使用すると、基本的に最初の変換を消去して最初から開始します。[[self ticketImageView] transform]CGAffineTransformIdentity

于 2012-07-18T22:37:12.963 に答える