2014-09-15 3 views
23

Итак, у меня было полное рабочее решение в iOS7, которое отображает LoginViewController через presentViewController в файле appFinishLaunching приложения AppDelegate.presentViewController в AppDelegate с задержкой в ​​iOS8

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

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

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

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

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

Я вижу, что это a ton от developers с этим kind of problem, но до сих пор не нашел решения.

+0

Вы нашли решение? Я видел ту же проблему с iOS 8 на iPhone 5S. Но симулятор Xcode 6 показывает нормальную анимацию на симуляторах iPhone 6/6 +. – marsant

+0

Также ищет решение – SomeGuy

+0

У симулятора также есть эта проблема, но вы не можете видеть это так четко, потому что это быстрее. Единственное решение, которое я нашел, - это создать эту анимацию самостоятельно с помощью контроллера контейнера. Однако у моего решения есть некоторые проблемы с tabviewcontrollers:/(viewDidAppear не вызывается, когда меняем viewcontrollers) –

ответ

0

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

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

1

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

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

Я быстро Hacky исправления:

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

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

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

17

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

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

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

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

+0

Работы. но строка состояния немного напугана. – markturnip

+0

@markturnip - это что касается цвета? Я заметил, что это лучше всего работает, если цвет строки состояния между обоими диспетчерами одинаковый, вы получаете другое странное поведение со строкой состояния? – SomeGuy

+0

Это работает, но, как упоминалось в @markturnip, строка состояния меняет цвет =/ –

-3

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

Смежные вопросы