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?
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];
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 .
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.
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)
}
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];