objective-c ios uiview uiviewcontroller uiviewanimationtransition

objective c - Transición UIViewController-objetivo-c



objective-c ios (4)

tratar

UIViewController* controller1; UIViewController* controller2; [controller1 transitionFromViewController:controller1 toViewController:controller2 duration:0.5f options:0 animations:nil completion:nil];

o

si está encima de navigationtroller - controller1, entonces

UINavigationController* nav; [nav pushViewController:controller2 animated:YES];

Tengo UIViewControllers A y B, están asignados en AppDelegate . Necesito aplicar la transición a ellos. ¿Cómo transitarlos sin reasignar y reemplazar UIViews ? Este código llama desde mi UIBarButtonItem en UINavigationController :

[UIView transitionFromView:self.view //UIViewController A toView:appDelegate.secondViewController.view //UIViewController B duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft

Este método reemplaza UIViews en mis UIViewControllers , y puedo devolverlos, o simplemente no sé cómo hacerlo. ¿Me puede decir cómo hacer esto?


Si estás en el mundo de iOS 5 y deseas saltar entre varios controladores de vista, es posible que desees seguir la Contención del controlador de vista . O consulte la sesión 102 de WWDC .

La contención del controlador de vista básicamente asume que usted tiene algún controlador de vista padre que gobierna la navegación entre múltiples controladores secundarios. En su caso, la vista principal sería una con la barra de navegación con el botón en ella.

Actualizar:

Si persigue la contención, puede crear un controlador de vista principal que tenga una barra de navegación con el botón. Cuando carga esa vista, puede agregar la primera vista secundaria. Así viewDidLoad podría verse así:

- (void)viewDidLoad { [super viewDidLoad]; // this is my model, where I store data used by my view controllers _model = [[MyModel alloc] init]; // let''s create our first view controller OneViewController *controller = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; // pass it our model (obviously, `model` is a property that I''ve set up in my child controllers) controller.model = _model; // let''s put the new child in our container and add it to the view [self addChildViewController:controller]; [self configureChild:controller]; [self.view addSubview:controller.view]; [controller didMoveToParentViewController:self]; // update our navigation bar title and the label of the button accordingly [self updateTitles:controller]; }

El configureChild solo hace la configuración final. Como una cuestión de conveniencia, con frecuencia tendré una UIView que configuré en IB (en este caso, llamado childView ) que uso para configurar el marco, lo que me saca del mundo de crear marcos manualmente, pero puedes hacerlo de la manera que quieras:

- (void)configureChild:(UIViewController *)controller { // configure it to be the right size (I create a childView in IB that is convenient for setting the size of the views of our child view controllers) controller.view.frame = self.childView.frame; }

Esta es la acción si toca el botón en la barra de navegación. Si estás en el primer controlador, configura el segundo controlador. Si estás en el segundo controlador, configura el primero:

- (IBAction)barButtonTouchUpInside:(id)sender { UIViewController *currentChildController = [self.childViewControllers objectAtIndex:0]; if ([currentChildController isKindOfClass:[OneViewController class]]) { TwoViewController *newChildController = [[TwoViewController alloc] initWithNibName:@"TwoViewController" bundle:nil]; newChildController.model = _model; [self transitionFrom:currentChildController To:newChildController]; } else if ([currentChildController isKindOfClass:[TwoViewController class]]) { OneViewController *newChildController = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; newChildController.model = _model; [self transitionFrom:currentChildController To:newChildController]; } else NSAssert(FALSE, @"Unknown controller type"); }

Esto hace la transición básica (incluidas las diversas llamadas relacionadas con la contención):

- (void)transitionFrom:(UIViewController *)oldController To:(UIViewController *)newController { [self addChildViewController:newController]; [self configureChild:newController]; [self transitionFromViewController:oldController toViewController:newController duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [self updateTitles:newController]; } completion:^(BOOL finished){ [oldController willMoveToParentViewController:nil]; [oldController removeFromParentViewController]; [newController didMoveToParentViewController:self]; }]; }

Este método simplemente configura el título en la barra de navegación en nuestro controlador de vista padre en función del niño seleccionado. También configura el botón para hacer referencia al otro controlador.

- (void)updateTitles:(UIViewController *)controller { if ([controller isKindOfClass:[OneViewController class]]) { self.navigationItemTitle.title = @"First View Controller"; // current title self.barButton.title = @"Two"; // title of button to take me to next controller } else if ([controller isKindOfClass:[TwoViewController class]]) { self.navigationItemTitle.title = @"Second View Controller"; // current title self.barButton.title = @"One"; // title of button to take me to next controller } else NSAssert(FALSE, @"Unknown controller type"); }

Todo esto supone que vas a crear y destruir controladores mientras saltas entre ellos. Generalmente hago esto, pero uso un objeto modelo para almacenar mis datos, así que guardo los datos que quiero.

Dijiste que no querías hacer esto "sin reasignar y reemplazar UIViews": si es así, también puedes cambiar el código anterior para crear ambos controles de vista secundarios por adelantado y cambiar la transición para que simplemente salte entre ellos:

- (void)viewDidLoad { [super viewDidLoad]; // this is my model, where I store data used by my view controllers _model = [[MyModel alloc] init]; // let''s create our first view controller _controller0 = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; _controller0.model = _model; [self addChildViewController:_controller0]; [self configureChild:_controller0]; [_controller0 didMoveToParentViewController:self]; // let''s create our second view controller _controller1 = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; _controller1.model = _model; [self addChildViewController:_controller1]; [self configureChild:_controller1]; [_controller1 didMoveToParentViewController:self]; // let''s add the first view and update our navigation bar title and the label of the button accordingly _currentChildController = _controller0; [self.view addSubview:_currentChildController.view]; [self updateTitles:_currentChildController]; } - (void)transitionFrom:(UIViewController *)oldController To:(UIViewController *)newController { [self transitionFromViewController:oldController toViewController:newController duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [self updateTitles:newController]; } completion:^(BOOL finished){ _currentChildController = newController; }]; } - (IBAction)barButtonTouchUpInside:(id)sender { UIViewController *newChildController; if ([_currentChildController isKindOfClass:[OneViewController class]]) { newChildController = _controller1; } else if ([_currentChildController isKindOfClass:[TwoViewController class]]) { newChildController = _controller0; } else NSAssert(FALSE, @"Unknown controller type"); [self transitionFrom:_currentChildController To:newChildController]; }

Lo he visto en ambos sentidos, por lo que puedes hacer lo que sea que funcione para ti.


Encontré una solución para mi problema. Este código funciona en iOS 4.x

[UIView beginAnimations:@"transition" context:nil]; [UIView setAnimationDuration:1.0]; [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.navigationController.view cache:NO]; [self.navigationController pushViewController:self.alternateView animated:NO]; [UIView commitAnimations];


Por favor mira aquí . Básicamente, desea implementar la contención UIViewController, que es una nueva característica en iOS5. El enlace proporcionado arriba proporciona algún código y un enlace a un proyecto github.

Buena suerte

t