2014-09-15 28 views
23

Tak więc miałem pełne działające rozwiązanie w iOS7, które wyświetla LoginViewController za pośrednictwem presentViewController w AppFinishLaunching AppDelegate.presentViewController w AppDelegate z opóźnieniem w iOS8

zasadzie robię coś takiego:

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

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

W systemów iOS 8 Widzę skok. Najpierw widzę backgroundViewController, a następnie po około 1 sekundzie pojawia się login.

Jak więc zapobiec temu skokowi w iOS8?

Widzę, że są a ton z developers z tym kind of problem, ale nadal nie znaleziono rozwiązania.

+0

Znalazłeś rozwiązanie? Widziałem ten sam problem z iOS 8 na iPhone 5S. Symulator Xcode 6 pokazuje normalną animację na symulatorze iPhone 6/6 +. – marsant

+0

Poszukuje również rozwiązania – SomeGuy

+0

Symulator również ma ten problem, ale nie widać go tak wyraźnie, ponieważ jest szybszy. Jedyne rozwiązanie, jakie znalazłem, to samodzielne stworzenie tej animacji za pomocą kontrolera widoku kontenera. Jednak moje rozwiązanie ma pewne problemy z tabviewcontrollers:/(viewDidAppear nie jest wywoływana, gdy zmienimy viewcontrollers) –

Odpowiedz

0

Mam również w obliczu tego samego problemu w systemów iOS 8 i znalazłem to rozwiązanie:

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; 

Mam nadzieję, że to rozwiązanie może pomóc!

1

Możesz ustawić okno na instancję kontrolera tymczasowego.

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

Z kontrolera zestawu (LoginViewController) można przesłać swój prawdziwy kontroler logowania z żądanym przejściem. Po zakończeniu sekwencji logowania można przejść z kontrolera logowania do domyślnego kontrolera widoku głównego aplikacji.

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

mam szybki hacky Fix:

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

To nie jest dobre dla dłuższej perspektywie, ale można szybko rozwiązać ten problem bez zmiany zbyt dużo kodu.

Oczekiwanie na lepsze rozwiązania.

17

także hack (na razie), ale tylko jedna linia kodu

dodać widok kontrolera widoku jesteś prezentującej do okna przed prezentacją

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

Jeśli prezentujemy kontroler nawigacyjny, zamiast dodawać widok kontrolera nawigacyjnego zamiast kontrolera widoku z góry.

+0

Działa. ale pasek stanu staje się nieco funky. – markturnip

+0

@markturnip jest to w odniesieniu do koloru? Zauważyłem, że to działa najlepiej, jeśli kolor paska stanu między dwoma kontrolerami widoku jest taki sam, czy pojawia się inne dziwne zachowanie na pasku stanu? – SomeGuy

+0

To działa, ale jak wspomniano w @markturnip pasek statusu zmienia kolor =/ –

-3

To powinno działać: wezwanie [loginViewController view] przed przedstawieniem go.