8

カールアップアニメーションを使用して、ウィンドウのルートビューコントローラーを別のビューコントローラーに置き換えるためのセグエを実行しようとしています。アイデアは、カールアップアニメーションを使用して、次のSplashViewController()に遷移する前に数秒間表示されているということです。performSegueWithIdentifier:LoginViewController

というカスタムUIStoryboardSegueクラスを作成しましたAnimatedSegue。オーバーライドされたperformメソッドのコードは次のとおりです。

- (void)perform
{
  UIViewController *source = self.sourceViewController;
  UIViewController *destination = self.destinationViewController;

  UIWindow *window = source.view.window;

  [UIView transitionFromView:source.view
                      toView:destination.view
                    duration:1.0
                     options:UIViewAnimationOptionTransitionCurlUp
                  completion:^(BOOL finished) {
                    [window setRootViewController:destination];
                  }];
}

iOS 6(明らかにiOS 5ではない)では、viewWillAppear:メソッドがViewControllerで2回呼び出されていることを除いて正常に動作しdestinationます。移行中に1回目、実行時に2回目と呼ばれるようです[window setRootViewController:destination];

ナビゲーションコントローラーは使いたくないことに注意してください。SplashViewController移行が終了すると、は(予想どおりに)割り当てが解除されます。

私の問題を解決する方法について何かアイデアはありますか?

4

3 に答える 3

10

他の誰かを助けることができる場合に備えて、私自身の質問に答えます...

のアニメーションメソッドの代わりに、 CoreAnimationCATransitionクラスを使用してセグエのアニメーションを作成することになりました。UIView

新しいperformメソッドは次のようになります。

- (void)perform
{
  UIViewController *source = self.sourceViewController;
  UIWindow *window = source.view.window;

  CATransition *transition = [CATransition animation];
  [transition setDuration:1.0];
  [transition setDelegate:self];
  [transition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
  [transition setType:@"pageCurl"];
  [transition setSubtype:kCATransitionFromBottom];

  [window.layer addAnimation:transition forKey:kCATransition];
  [window setRootViewController:self.destinationViewController];
}
于 2012-10-18T03:36:48.120 に答える
2

カスタムセグエを備えた2つのコントローラーではなく、2つのビューと1つのコントローラーを使用して、これを別の方法で行う可能性があります。ストーリーボードに、コントローラーの空白のビューを用意し、スプラッシュビューとメインビューを含む2つのxibファイル(ビュータイプ)を追加します。スプラッシュビューは、viewDidLoadのコントローラーのビューのサブビューとして追加され、次に行ったのと同じ方法を使用して切り替えられます。

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.splashView = [[NSBundle mainBundle] loadNibNamed:@"SplashView" owner:self options:nil].lastObject;
    [self.view addSubview:self.splashView];
    [self performSelector:@selector(removeSplash) withObject:nil afterDelay:2];
}

-(void)removeSplash {
    self.mainView = [[NSBundle mainBundle] loadNibNamed:@"MainView" owner:self options:nil].lastObject;
    [UIView transitionFromView: self.splashView toView:self.mainView duration:.6 options:UIViewAnimationOptionTransitionCurlUp
                    completion:nil];
}
于 2012-10-17T22:41:49.453 に答える
1

本当に、transitionFromView:私が見つけた唯一の機能を使用したいのであれば、ソースビューコントローラのスクリーンショットを作成し、それをアニメーション化するだけです。

- (void)perform
{
    UIViewController *source = self.sourceViewController;
    UIViewController *destination = self.destinationViewController;

    // Create screenshot for animation
    UIGraphicsBeginImageContextWithOptions(source.view.bounds.size, NO, 0.0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [source.view.layer renderInContext:context];
    UIImageView *screenShot = [[UIImageView alloc] initWithImage:UIGraphicsGetImageFromCurrentImageContext()];
    UIGraphicsEndImageContext();

    // Put destination view controller and screen shot in place
    UIWindow *window = source.view.window;
    window.rootViewController = destination;
    [window addSubview:screenShot];

    [UIView transitionFromView:screenShot
                        toView:destination.view
                      duration:1.0
                       options:UIViewAnimationOptionTransitionCurlUp
                    completion:^(BOOL finished) {
                    }];
}

viewWillAppear:そして、その同類は期待通りに一度だけ呼び出されます。

于 2013-07-26T17:40:44.690 に答える