web-dev-qa-db-fra.com

Comment faire l'animation Flip entre deux UIViewControllers en cliquant sur le bouton info?

J'ai une page de connexion nommée "LoginViewController". J'ai un bouton d'information sur cette page. Si je clique dessus, je souhaite afficher des informations sur ma candidature. Aussi, je veux présenter cette page d'information en utilisant une animation Flip. 

Le code pour créer le bouton info est,

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

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

Si je clique sur le bouton d'information, la méthode displayInfoView sera appelée. Là je peux montrer une UIView pour afficher certaines informations. Ai-je raison?

Pour l'animation flip, j'ai utilisé ce code ...

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

Ici loginPageView est la vue de connexion qui contient le bouton info. infoView est la vue contenant les informations sur l'application. mainView est la vue commune qui contient la vue actuelle.

Maintenant, mon problème est qu'au lieu d'afficher une UIView, puis-je afficher une autre classe de contrôleur de vue en cliquant sur le bouton d'information? Rappelez-vous que l'action de retournement fonctionne bien avec UIView. Mais quand j'essaie avec UIViewController, cela crée des problèmes.

Quelqu'un peut-il me suggérer comment afficher un contrôleur UIViewController (dans mon application, je dois afficher AboutViewController) en cliquant sur le bouton d'information avec l'effet de retournement?

36
Rajkanth

Pour basculer dans un contrôleur de vue:

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

Pour en sortir:

[self dismissViewControllerAnimated:YES completion:nil];
125
Filip Radelic

Voici comment je le fais:

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

Le crédit va à faysar ici .

20
Michael Morrison

Il existe une faille fondamentale dans votre compréhension de la structure de MVC dans Cocoa Touch, à savoir: Contrôleurs de vues et Vues sont comparables et similaires. La vérité est qu'ils ne le sont pas.

Pour revenir à votre question spécifique, oui, les animations sont basées sur des vues, pas sur des contrôleurs de vue. Mais chaque vue doit être contrôlée par l'un de vos contrôleurs. Et ce qui-vue-appartient-à-quel-contrôleur-chose est totalement à vous. Dans votre cas, une animation peut avoir lieu entre 2 vues avec 2 contrôleurs différents, ou entre 2 vues du même contrôleur.

En ce qui concerne les exemples de code, je vous suggère d’examiner l’un des modèles par défaut de Xcode, l’utilitaire Utility Application , qui a implémenté cette animation click-and-flip de manière succincte et normalisée.

5
Di Wu
  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)

    }
1
taha

lignes simples de code

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