2011-01-07 5 views
36

Ich habe eine Login-Seite namens "LoginViewController". Ich habe eine Info-Taste auf dieser Seite. Wenn ich darauf klicke, möchte ich Informationen über meine Bewerbung anzeigen. Außerdem möchte ich diese Informationsseite mit einer Flip-Animation darstellen.Wie wird die Flip-Animation zwischen zwei UIViewControllern ausgeführt, während auf den Info-Button geklickt wird?

Der Code Info-Taste für die Erstellung ist,

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

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

Wenn ich auf die Info-Schaltfläche klicken, wird die displayInfoView Methode aufgerufen werden. Dort kann ich eine UIView anzeigen, um einige Informationen anzuzeigen. Habe ich recht?

Für Flip-Animation, habe ich diesen 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]; 

Hier loginPageView die Anmelde Ansicht ist, die die Info-Taste enthält. infoView ist die Ansicht, die Informationen zur Anwendung enthält. mainView ist die allgemeine Ansicht, die die vorliegende Ansicht enthält.

Jetzt ist mein Problem, anstatt eine UIView anzuzeigen, kann ich eine andere Ansicht Controller-Klasse zeigen, während Sie auf die Schaltfläche Info klicken? Denken Sie daran, die Flip-Aktion funktioniert gut mit UIView. Aber wenn ich es mit einem UIViewController versuche, macht das Ärger.

Kann mir jemand vorschlagen, wie man einen UIViewController zeigt (in meiner App muss ich AboutViewController zeigen), während ich auf die Info-Taste mit dem Flip-Effekt klicke?

Antwort

5

Es ist ein grundlegender Fehler in Ihrem Verständnis der MVC-Struktur in Cocoa Touch, das ist, View-Controller und Ansichten vergleichbar sind und ähnlich. Die Wahrheit ist, sie sind nicht.

Zurück zu Ihrer spezifischen Frage, ja, Animationen basieren auf Ansichten, nicht auf Ansicht-Controller. Aber jede Ansicht sollte von einem Ihrer View-Controller gesteuert werden. Und das, was-sehen-gehört-zu-was-Controller Sache ist ganz bei Ihnen. In Ihrem Fall könnte die Animation zwischen zwei Ansichten mit zwei verschiedenen Controllern stattfinden, oder sie könnten auch zwischen zwei Ansichten desselben Controllers auftreten.

Wie für Codebeispiele, schlage ich vor, Sie eine der Xcode-Standardvorlagen, die Utility-Anwendung, die diese Click-and-Flip-Animation in einer prägnanten und standardisierten Art und Weise implementiert hat.

+0

Dank für Ihre Antwort danken. .. Ich versuche die Animation zwischen zwei View-Controllern zu machen.Nicht Ansichten –

+0

Es funktioniert gut mit einem Viewcontroller und einer Ansicht. Aber funktionierte nicht mit zwei Viewcontrollern –

+1

Können Sie Ihr Codeformat bearbeiten, damit ich es anschauen kann? Jetzt ist das Format so chaotisch, dass ich nicht einmal weiß, wo ich anfangen soll. –

20

Dies ist, wie ich es so mache:

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

Kredit geht here faysar.

+1

Navigation Controller hat einen ziemlich klaren Zweck, und auch Modal View-Controller. Warum einen benutzen, um den Zweck eines anderen zu erreichen? –

+1

Weil Michaels Version funktioniert, ohne auch die 'UITabBar' zu spiegeln. Wer hat nach Modal View Controllern gefragt? – cheeesus

124

Um in einen View-Controller-Flip:

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

Um aus ihm Flip:

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

Ich dachte, ich brauche einen Navigationscontroller, bis ich deine Antwort gelesen habe. –

0

einfache Codezeilen

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) 

    }