2012-03-23 17 views
7

Kontekst: Próbuję wykonać niestandardową animację od zwykłego UIViewController.view do UISplitViewController.view. Animacja powinna pokazywać się od lewej do prawej.iOS: animacja niepoprawnej orientacji w rootViewController?

Ustawiłem self.window.rootViewController = viewController gdzie viewController jest normalnym UIViewController.

Po bezstykowa użytkownika dodaje pobiera nazywane:

UIView *theWindow = [viewController.view superview]; 

[viewController.view removeFromSuperview]; 
[theWindow addSubview:self.splitViewController.view]; 


CATransition *animation = [CATransition animation]; 
[animation setDuration:0.5]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:kCATransitionFromLeft]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; 

Gdy urządzenie jest w trybie portretowym, wszystko poszło idealnie. Jednak gdy urządzenie znajduje się w trybie poziomym, animacja przejścia działa tak, jakby urządzenie nadal znajdowało się w trybie portretu. Na przykład: Zamiast wchodzić z lewej strony, przychodzi od dołu. Orientacja obu widoków jest całkowicie poprawna. Tylko przejście jest dziwne.

+0

Po obróceniu do góry w innym kierunku, czy animacja wystąpić z góry? A może od dołu, niezależnie od tego, w którą stronę przejdziesz w tryb krajobrazu? Stała przenosi animację z lewej strony warstwy. Zastanawiam się, czy ramka warstwy nie jest aktualizowana, więc po jej obróceniu znajdowała się teraz strona dolna warstwy. – jmstone617

+0

To prawda. Animacja ignoruje wszelkie zmiany orientacji. Wszelkie sugestie, jak upewnić się, że warstwa zostanie zaktualizowana? – Byte

+0

Mam ten sam problem - orientacja CALayera po prostu nie pasuje do jego widoku. Wydaje się, że jest kilka innych podobnych postów na ten temat, ale żadne z rozwiązań nie działa dla mnie. Obracanie warstwy o 90 stopni oczywiście obraca widok, więc to nie pomaga .. – jonydep

Odpowiedz

9

Tak więc, bawiłem się z twoim kodem (zrobiłem najlepiej-odgadnąć rekonstrukcję, jak masz ustawiony twój projekt), i udało mi się uzyskać pożądany efekt za pomocą następującego kodu. Próbowałem ustawić ramki i granice warstw, widoków lub podwarstw itp. I nic z tego nie zadziałało. CATransform3D's, CATransform3DRotates itp. Również nie działały. Ja też szukałem dobrej godziny. Albo nikt nie miał twojego problemu, albo nikt nie rozwiązał twojego problemu. Niezależnie od tego, to rozwiązanie działa, a chyba jakiś guru Core Animation może zapewnić lepsze rozwiązanie, zapraszamy do tego:

- (void)swipeGesture:(UISwipeGestureRecognizer *)sender { 

UIView *theWindow = [self.viewController.view superview]; 

UIInterfaceOrientation interfaceOrientation = self.viewController.interfaceOrientation; 
NSString *subtypeDirection; 
if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 
    subtypeDirection = kCATransitionFromTop; 
} 
else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
    subtypeDirection = kCATransitionFromBottom; 
} 
else { 
    subtypeDirection = kCATransitionFromLeft; 
} 

[self.viewController.view removeFromSuperview]; 
[theWindow addSubview:self.splitViewController.view]; 

CATransition *animation = [CATransition animation]; 
[animation setDuration:0.5]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:subtypeDirection]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; 
} 
+0

To rozwiązanie działa, chociaż mam nadzieję, że nie dojdzie do tego (ręcznie dostosować przejście). Mam inną animację, która zależy od orientacji okna, która nie ma do tego zastosowania. Jeśli nie pojawi się lepsze rozwiązanie, zaznaczę twoją odpowiedź poprawnie, zanim skończy się nagroda. Dziękuję Ci. – Byte

+1

Zrozumiano. Przykro mi, ale nie mogłem zapewnić ci lepszego rozwiązania. Przygotowałem przykładowy projekt i spędziłem wczoraj dobre 3 godziny, próbując coś znaleźć. Pomysł jest prosty: zaktualizuj ramkę warstwy okna tak, aby pasowała do orientacji warstwy widoku początkowego. Niestety, wprowadzenie tego w życie nie wydaje się takie proste. – jmstone617

+0

Mam rację myśląc, że to tylko wybiera właściwy kierunek przejścia? Nadal nie dostosowuje rozmiaru "ramki" przejścia? – jonydep

Powiązane problemy