Подтвердить что ты не робот

PresentViewController в AppDelegate с задержкой в ​​iOS8

Итак, у меня было полное рабочее решение в iOS7, которое отображает LoginViewController через presentViewController в AppDelegate didFinishLaunching.

В основном я делаю что-то вроде этого:

UIViewController *backgroundViewController = ...
self.window.rootViewController = backgroundViewController;
[self.window makeKeyAndVisible];

[self.window.rootViewController presentViewController:loginViewController
                                             animated:NO ...]

В iOS8 я вижу прыжок. Сначала я вижу backgroundViewController, а затем примерно через 1 секунду появляется логин.

Итак, как я могу предотвратить этот переход в iOS8?

Я вижу, что тонна разработчиков с этим проблема, но все еще не нашли решения.

4b9b3361

Ответ 1

Также взлом (на данный момент), но только одна строка кода

Добавить представление контроллера представления, который вы представляете в окне перед представлением

UIViewController *viewController = [[UIViewController alloc] init];
[viewController.view setBackgroundColor:[UIColor greenColor]];

//  Temporary iOS8 fix for 'presentation lag' on launch
[self.window addSubview:viewController.view];

[self.window.rootViewController presentViewController:viewController animated:NO completion:nil];

Если вы представляете контроллер навигации, чем добавляете представление контроллера навигации вместо своего контроллера верхнего уровня.

Ответ 2

У меня быстрое хакерское исправление:

//Make a screenshot of the ViewController first, or use a real image if you want

__block UIImageView *fakeImageView = [[UIImageView alloc] initWithImage:image];
fakeImageView.frame = vc.view.frame;
[self.view addSubview:fakeImageView];

[self presentViewController:vc animated:animated completion:^{
    [fakeImageView removeFromSuperview];
    fakeImageView = nil;
}];

Это не хорошо для долгосрочного, но может быстро исправить эту проблему, не меняя слишком много кода.

Ожидание лучших решений.

Ответ 3

Вы можете установить окно для экземпляра временного контроллера.

self.window.backgroundColor = [UIColor whiteColor]; //do some styling etc.
self.window.rootViewController =  [LoginViewController new]; 
[self.window makeKeyAndVisible];

Из контроллера установки (LoginViewController) вы можете нажать свой настоящий контроллер входа с желаемым переходом. Как только последовательность входа завершена, вы можете перейти от контроллера входа в контроллер корневого приложения приложения по умолчанию.

[UIView transitionWithView:[AppGlobal sharedApp].applicationWindow
  duration:0.75
  options:UIViewAnimationOptionTransitionFlipFromLeft
  animations:^{
   [AppGlobal sharedApp].applicationWindow.rootViewController = [AppRootViewController new];
  } completion:nil];

Ответ 4

Я также столкнулся с той же проблемой в iOS8, и нашел это решение:

ABCViewController *obj = [[ABCViewController alloc] initWithNibName:@"ABCViewController" bundle:nil];                        

CATransition *transition = [CATransition animation];
transition.duration = 0.4;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromBottom;
transition.delegate = self;
[self.navigationControler.view.layer addAnimation:transition forKey:nil];
[appDelegate.navigationControler obj animated:NO];
 obj = nil;

Я надеюсь, что это решение поможет вам!

Ответ 5

Это должно работать: вызов [loginViewController view] Перед тем, как представить его.