2011-01-07 15 views
36

Tengo una página de inicio de sesión llamada "LoginViewController". Tengo un botón de información en esta página. Si hago clic en él, quiero mostrar información sobre mi aplicación. También quiero presentar esa página de información usando flip animation.¿Cómo hacer la animación invertida entre dos UIViewControllers mientras se hace clic en el botón de información?

El código para crear botón de información es,

infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight]; 
infoButton.frame = CGRectMake(285, 425, 30, 30); 
infoButton.backgroundColor = [UIColor clearColor]; 

[infoButton addTarget:self 
      action:@selector(displayInfoView) 
      forControlEvents:UIControlEventTouchUpInside]; 

Si hago clic en el botón de información, se llamará al método displayInfoView. Ahí puedo mostrar un UIView para mostrar cierta información. ¿Estoy en lo cierto?

por dicha animación, que utiliza este código ...

[UIView beginAnimations:nil context:NULL]; 

[UIView setAnimationDuration:.8]; 

[UIView setAnimationTransition:([loginPageView superview] ? UIViewAnimationTransitionFlipFromLeft : UIViewAnimationTransitionFlipFromRight) 
     forView:mainView 
     cache:YES]; 

if ([infoView superview]) { 
    [infoView removeFromSuperview]; 
    [mainView addSubview:loginPageView]; 
} 
else { 
    [loginPageView removeFromSuperview]; 
    [mainView addSubview:infoView]; 
} 

[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 
[UIView commitAnimations]; 

Aquí loginPageView es la vista de inicio de sesión que contiene el botón de información. infoView es la vista que contiene la información sobre la aplicación. mainView es la vista común que mantiene la vista actual.

Ahora mi problema es que, en lugar de mostrar UIView, ¿puedo mostrar otra clase de controlador de vista mientras hago clic en el botón de información? Recuerde que la acción de volcado funciona bien con UIView. Pero cuando intento con un UIViewController, esto crea problemas.

¿Puede alguien sugerirme cómo mostrar un UIViewController (en mi aplicación, necesito mostrar AboutViewController) al hacer clic en el botón de información con el efecto de volteo?

Respuesta

5

Hay una falla fundamental en su comprensión de la estructura MVC en Cocoa Touch, que es, Ver Controladores y Vistas son comparables y similares. La verdad es que no lo son.

Volviendo a su pregunta específica, sí, las animaciones se basan en vistas, no en controladores de vista. Pero cada vista debe ser controlada por uno de sus controladores de vista. Y esta cosa que-vista-pertenece-a-qué-controlador es totalmente de usted. En su caso, la animación podría ocurrir entre 2 vistas con 2 controladores diferentes, o también podrían ocurrir entre 2 vistas del mismo controlador.

En cuanto a ejemplos de código, le sugiero que eche un vistazo a una de las plantillas predeterminadas de Xcode, la aplicación Utilidad, que ha implementado esta animación, haga clic-y-flip de una manera sucinta y estandarizada.

+0

Gracias por su respuesta. Estoy tratando de hacer la animación entre dos controladores de vista.Not views –

+0

Funciona bien con un viewcontroller y una vista. Pero no funcionó con dos viewcontrollers –

+1

¿Puedes editar el formato del código para que pueda verlo? Ahora el formato es tan complicado que ni siquiera sé por dónde empezar. –

20

Así es como lo estoy haciendo:

AboutShowViewController *aboutShowViewController = [[AboutShowViewController alloc] initWithNibName:@"AboutShowViewController" bundle:[NSBundle mainBundle]]; 

    [UIView beginAnimations:@"View Flip" context:nil]; 
    [UIView setAnimationDuration:0.80]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 

    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight 
          forView:self.navigationController.view cache:NO]; 

    [self.navigationController pushViewController:aboutShowViewController animated:YES]; 
    [UIView commitAnimations]; 

    [aboutShowViewController release]; 

crédito va a faysar here.

+1

El controlador de navegación tiene un propósito bastante claro, al igual que los controladores de vista modal. ¿Por qué usar uno para lograr el propósito de otro? –

+1

Porque la versión de Michael funciona sin tener que voltear el 'UITabBar'. ¿Quién preguntó sobre los controladores de vista modal? – cheeesus

124

Para invertir en un controlador de vista:

viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentViewController:viewController animated:YES completion:nil]; 

para voltear fuera de él:

[self dismissViewControllerAnimated:YES completion:nil]; 
+0

pensé que necesitaba un controlador de navegación hasta que leí tu respuesta. –

0

simples líneas de código

YourViewController *city = [self.storyboard instantiateViewControllerWithIdentifier:@"YourViewController"]; 
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:.5]; 
[self.navigationController pushViewController:city animated:YES]; 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:NO]; 
[UIView commitAnimations]; 
-1
override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(true) 
     // for back button 
     changeTransition() 
    } 
     //btnMap.addTarget(self, action: #selector(searchHotelsResultVC.goToMap), for: .touchUpInside) 
     //btnMap.addTarget(self, action: #selector(MapViewController.backToList), for: .touchUpInside) 
func goToMap() { 
     // for pushing 
    changeTransition() 
navigationController?.pushViewController(settingsVC, animated: false) 
} 
func backToList() { 
     // for dismiss 
     changeTransition() 
     navigationController?.popViewController(animated: false) 
     dismiss(animated: true, completion: nil) 

    } 
    func changeTransition() { 
     let transition = CATransition() 
     transition.duration = 0.5 
     transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 
     //transition.type = kCATransitionPush 
     transition.type = "flip" 
     transition.subtype = kCATransitionFromLeft 
     navigationController?.view.layer.add(transition, forKey: kCATransition) 

    } 
Cuestiones relacionadas