7

-animationWithDuration:animation:Apple の推奨事項に従って、次のように への別の呼び出しのcompletion:ブロックにへの後続の呼び出しを配置することで、UIView アニメーションを連鎖させてaanimateWithDuration:animation:completion:います。

[UIView animateWithDuration:scaleDuration delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
    // Scale the controllers' views down.
    self.view.transform = CGAffineTransformScale(self.view.transform, 0.8, 0.8);
} completion:^(BOOL finished) {
    // Transition to the new view and push on the new view controller.
    [UIView transitionWithView:self.view duration:1 options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionTransitionFlipFromLeft animations:^{
        [self pushViewController:viewController animated:NO];
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:scaleDuration delay:0 options:UIViewAnimationOptionCurveLinear animations:
^{
            // Scale back to the original size.
            self.view.transform = CGAffineTransformScale(self.view.transform, 1.25, 1.25);
        } completion:nil];
    }];
}];

アニメーションはすべて正しい順序で実行されますが、特に呼び出しの前に、それらの間にわずかな遅延があり-transitionWithView:duration:options:animations:completion:ます。アニメーションのステップ間のトランジションを滑らかにするにはどうすればよいですか?

4

3 に答える 3

2

余談ですが、このようにナビゲーション コントローラーを悪用している
特定の理由はあります? presentViewController:animated:completion:トランジション スタイルを に設定して使用できませんでしたUIModalTransitionStyleFlipHorizontalか?

質問に戻る:

pushViewController:animated:吃音は、プッシュされるView Controllerのビューを暗黙的にロードする必要があり、これには時間がかかるという単純な事実に起因していると確信しています。

したがって、(または presentModalViewController:animated: iOS 4 をサポートする必要がある場合) アプローチを使用できない場合は、次のpresentViewController:animated:completion:方法を試すことをお勧めします。

// ensure the view is already loaded when you invoke `pushViewController:animated:`
[viewController view];

// there is no strict need to calculate those in situ, so we do it up front
CGAffineTransform originalTransform = self.view.transform;
CGAffineTransform downscalingTransform = CGAffineTransformScale(originalTransform, 0.8, 0.8);

// I found it hard to read the block-in-a-block-in-a... while editing here, so I've taken them apart:
void (^scaleDownAnimation)() = ^{
    self.view.transform = downscalingTransform;
};

void (^restoreScaleAnimation)() = ^{
    self.view.transform = originalTransform;
};

void (^pushControllerAnimation)() = ^{
    [self pushViewController:viewController animated:NO];
};

void (^pushAnimationCompletion)(BOOL) = ^(BOOL unused) {
    [UIView animateWithDuration:scaleDuration
                          delay:0
                        options:UIViewAnimationOptionCurveLinear
                     animations:restoreScaleAnimation
                     completion:nil];
};

void (^downscaleCompletion)(BOOL) = ^(BOOL unused){
    UIViewAnimationOptions linearFlipFromLeft = UIViewAnimationOptionCurveLinear | UIViewAnimationOptionTransitionFlipFromLeft;
    [UIView transitionWithView:self.view
                      duration:1
                       options:linearFlipFromLeft
                    animations:pushControllerAnimation
                    completion:pushAnimationCompletion];
};

[UIView animateWithDuration:scaleDuration
                      delay:0
                    options:UIViewAnimationOptionCurveEaseIn
                 animations:scaleDown
                 completion:downscaleCompletion];

牛肉は最初の 6 行以内にあることに注意してください。残りは完全を期すためのものです。

于 2012-05-19T08:47:33.217 に答える
0

あなたが説明するように、私はアニメーションを遅滞なく連鎖させました。

transitionWithView:duration:options:animations:completion:を使用しており、アニメーションブロックはpushViewController:animated:の呼び出しです。それは私には意味がありません。

transitionWithView:duration:options:animations:completionは、あるサブビューから次のサブビューに遷移します。

pushViewController:animatedは、ナビゲーションコントローラースタックにビューコントローラーをプッシュするナビゲーションコントローラーメソッドです。これら2つを一緒に使用することは私には意味がありません。

スケールアニメーションをプッシュで終了する場合は、完了ブロックから直接プッシュアニメーションを呼び出します。

于 2012-05-16T22:06:46.910 に答える