EDYCJA: Nowa odpowiedź, która działa w każdej orientacji.
Oryginalna odpowiedź działa tylko wtedy, gdy interfejs jest w orientacji pionowej. Są to animacje przejścia widoku b / c, które zastępują widok z innym widokiem, muszą występować z widokami co najmniej o poziom poniżej pierwszego widoku dodanego do okna (npwindow.rootViewController.view.anotherView
.).
Zaimplementowałem prostą klasę kontenera, którą nazwałem TransitionController
. Możesz go znaleźć na https://gist.github.com/1394947 .
Na marginesie wolę implementację w oddzielnej klasie b / c, która jest łatwiejsza do ponownego wykorzystania. Jeśli tego nie chcesz, możesz po prostu zaimplementować tę samą logikę bezpośrednio w delegacie aplikacji, eliminując potrzebę stosowania TransitionController
klasy. Logika, której potrzebujesz, byłaby jednak taka sama.
Użyj go w następujący sposób:
W delegacie aplikacji
// add a property for the TransitionController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
MyViewController *vc = [[MyViewContoller alloc] init...];
self.transitionController = [[TransitionController alloc] initWithViewController:vc];
self.window.rootViewController = self.transitionController;
[self.window makeKeyAndVisible];
return YES;
}
Aby przejść do nowego kontrolera widoku z dowolnego kontrolera widoku
- (IBAction)flipToView
{
anotherViewController *vc = [[AnotherViewController alloc] init...];
MyAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate.transitionController transitionToViewController:vc withOptions:UIViewAnimationOptionTransitionFlipFromRight];
}
EDYCJA: Oryginalna odpowiedź poniżej - działa tylko w orientacji pionowej
Przyjąłem następujące założenia dla tego przykładu:
Masz przypisany kontroler widoku jako rootViewController
okno
Po przełączeniu do nowego widoku chcesz zamienić bieżący viewController na viewController będący właścicielem nowego widoku. W dowolnym momencie aktywny jest tylko bieżący kontroler viewController (np. Przydzielony).
Kod można łatwo zmodyfikować, aby działał inaczej, kluczową kwestią jest animowane przejście i kontroler pojedynczego widoku. Upewnij się, że nie zachowujesz kontrolera widoku poza przypisaniem go do window.rootViewController
.
Kod do animacji przejścia w delegacie aplikacji
- (void)transitionToViewController:(UIViewController *)viewController
withTransition:(UIViewAnimationOptions)transition
{
[UIView transitionFromView:self.window.rootViewController.view
toView:viewController.view
duration:0.65f
options:transition
completion:^(BOOL finished){
self.window.rootViewController = viewController;
}];
}
Przykładowe użycie w kontrolerze widoku
- (IBAction)flipToNextView
{
AnotherViewController *anotherVC = [[AnotherVC alloc] init...];
MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate transitionToViewController:anotherVC
withTransition:UIViewAnimationOptionTransitionFlipFromRight];
}