IPhone: переход Fade между двумя RootViewControllers

Obj-C или MonoTouch C# ответы в порядке.

Исходный UIWindow RootViewController - это простой экран входа.

window.RootViewController = loginScreen;

После входа в систему я установил Root в основное приложение

window.RootViewController = theAppScreen;

Как переместить Fade-переход между двумя RootViewControllers в этом экземпляре?

Ответ 1

Я мог бы предложить другой подход, который даст вам вашу анимацию. Сначала перейдите к контроллеру theAppScreen, и если вам нужно, чтобы пользователь зашел в систему, попросите presentViewController перейти к loginScreen (вам не нужно анимировать этот шаг, если вы хотите, чтобы он выглядел как он перешел непосредственно на экран входа в систему). Таким образом, когда вы успешно вошли в систему, loginScreen может просто dismissViewControllerAnimated, и ваша анимация вернется к главному theAppScreen. (Очевидно, что если вы хотите эффект затухания, не забудьте установить контроллер modalTransitionStyle на UIModalTransitionStyleCrossDissolve.)

Если вы умерли, изменив свой rootViewController, единственный способ, которым я могу это сделать (и мне это не нравится), - это сделать что-то вроде:

MainAppViewController *controller = [[MainAppViewController alloc] initWithNibName:@"MainAppViewController" bundle:nil];

// animate the modal presentation

controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

[self.window.rootViewController presentViewController:controller 
                                             animated:YES
                                           completion:^{

    // and then get rid of it as a modal

    [controller dismissViewControllerAnimated:NO completion:nil];

    // and set it as your rootview controller

    self.window.rootViewController = controller;
}];

Первый метод кажется мне намного более чистым.

Ответ 2

Это MT-код метода @Robert Ryan (хотя я согласен с его предложением, что theAppScreen, вероятно, является "правильным" RootViewController):

void DissolveIn (UIWindow window, UIViewController newController)
{
  newController.ModalTransitionStyle = UIModalTransitionStyle.CrossDissolve;
  window.RootViewController.PresentViewController (newController, true, () => 
  {
    window.RootViewController.DismissViewController (false, null);
    window.RootViewController = newController;
  });
}

Ответ 3

Вы можете сделать это:

window.RootViewController = theAppScreen;

loginScreen.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[theAppScreen presentModalViewController:loginScreen animated:NO];

loginScreen может отменить себя, когда закончится: [self dismissModalViewControllerAnimated:YES];

НЕТ на первой анимации заставит loginScreen появиться без видимой видимости theAppScreen под ним. Анимация = ДА при завершении обеспечит кросс-растворение.