5

UINavigationController があります。VC1 を rootViewController にし、プログラムで VC1 から VC2 をロードしてから、カスタム アニメーションを VC1 から VC2 に移動します。標準。すべてがうまくて良いです。

さて、次のように 2 つの間にカスタム アニメーションを作成したいと思います。 カスタムアニメーション

つまり、VC1 はスライドして見えなくなり、VC2 はその下にあります。最初のシート (VC1) をスライドさせて、下のシート (VC2) を明らかにする紙の束のように。

だから私が試したのは、VC2に到達するためにVC1から呼び出される次のコードです。しかし、それには問題があります:

MyVC2 *vctwo = [[[MyVC2 alloc] init] autorelease];

CATransition *transition = [CATransition animation];
transition.duration = 1;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionReveal;
transition.subtype = kCATransitionFromRight;
transition.delegate = self;
[self.navigationController.view.layer addAnimation:transition forKey:nil];

[[self navigationController] pushViewController:vctwo animated:YES];

問題は次のとおりです。

  1. VC2 はバックグラウンドで固定されていません。それも一種のスライドインです (kCATransitionReveal を指定しましたが)。バックグラウンドで VC2 を完全に固定したい。
  2. VC1 がフェードアウトします。理由はよくわかりません。kCATransitionFade などは使っていないので、フェードがどこから来ているのかわかりません。

期待した結果が得られない理由を教えていただければ幸いです。これが明らかな場合は申し訳ありませんが、私はこれを何時間も試していて、本当にイライラしました.

4

2 に答える 2

3

[[self navigationController] pushViewController:vctwo animated:NO];ではなく使うべきだと思いますanimated:YES

于 2011-10-05T15:45:05.290 に答える
1

これを行う唯一の方法は、UINavigationControllerを忘れて、すべてを処理するための独自のメカニズムを考え出すことだと思います。

このブログはその方法を説明しています...

したがって、VC間でアニメーションをカスタム化する場合は、UINavigationControllerを使用しないでください。上記のように2つのVC間でスワップするサンプルコードは次のとおりです。

    -(void)slideDoorOpenTo:(UIViewController *)aController duration:(float)aDuration {

    [aController viewWillAppear:YES];
    [activeController viewWillDisappear:YES];

    //aController.view.alpha = 0.0f;
    [self.view insertSubview:aController.view belowSubview:activeController.view]; // so that it is below activeController

    [aController viewDidAppear:YES];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:aDuration];

    aController.view.transform = CGAffineTransformMakeTranslation(0,0);
    activeController.view.transform = CGAffineTransformMakeTranslation(-320,0);

    [UIView commitAnimations];

    [self performSelector:@selector(animationDone:) withObject:aController afterDelay:aDuration];


}
于 2011-10-05T20:01:32.930 に答える