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

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

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

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

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

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

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

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


person Tiago Almeida    schedule 15.09.2014    source источник
comment
Вы нашли решение? Я видел ту же проблему с iOS 8 на iPhone 5S. Но симулятор Xcode 6 показывает нормальную анимацию на симуляторах iPhone 6/6+.   -  person marsant    schedule 19.09.2014
comment
Тоже ищу решение   -  person SomeGuy    schedule 20.09.2014
comment
Симулятор также имеет эту проблему, но вы не можете увидеть ее так ясно, потому что он быстрее. Единственное решение, которое я нашел, - это создать эту анимацию самостоятельно с помощью контроллера представления контейнера. Однако у моего решения есть некоторые проблемы с контроллерами tabview :/ (viewDidAppear не вызывается, когда мы меняем контроллеры просмотра)   -  person Tiago Almeida    schedule 20.09.2014
comment
У меня та же проблема, и после некоторого расследования я обнаружил, что в моем случае лучшим решением является не представление loginViewController, а установка self.window.rootViewController = loginViewController. И когда мне нужно закрыть loginViewController, я устанавливаю self.window.rootViewController = backgroundViewController. Мне не нравится это решение, но оно работает.   -  person somedev    schedule 24.09.2014
comment
Недостатком является то, что вы не можете предварительно загрузить данные в backgroundViewController. Кроме того, у вас не может быть более общего решения для представления этого экрана входа в систему (если пользователь выходит из системы, или срок действия токена истекает и т. д., у вас всегда был один и тот же код, и единственное, что изменилось, это флаг анимации).   -  person Tiago Almeida    schedule 24.09.2014
comment
@somedev В итоге я пошел по этому пути, добавил публикацию уведомления loginWillComplete, где я переключил rootViewController, и после этого продолжил процесс входа в систему. Работает как шарм.   -  person Wilmar    schedule 11.11.2014


Ответы (5)


Тоже хак (пока), но всего одна строчка кода

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

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];

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

person SomeGuy    schedule 11.10.2014
comment
Работает. но строка состояния становится немного напуганной. - person markturnip; 24.10.2014
comment
@markturnip это что касается цвета? Я заметил, что это работает лучше всего, если цвет строки состояния между обоими контроллерами представления одинаков, вы получаете другое странное поведение со строкой состояния? - person SomeGuy; 24.10.2014
comment
Это работает, но, как упоминалось @markturnip, строка состояния меняет цвет =/ - person Marcos Curvello; 05.12.2014

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

//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;
}];

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

Ждем лучших решений.

person Meng Zhang    schedule 09.10.2014

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

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];
person Slav    schedule 23.09.2014

Я также столкнулся с той же проблемой в 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;

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

person sachin khard    schedule 23.09.2014

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

person JaganY    schedule 19.02.2015