2011-01-07 5 views
36

Mam stronę logowania o nazwie "LoginViewController". Mam przycisk informacji na tej stronie. Jeśli go kliknę, chcę pokazać trochę informacji o mojej aplikacji. Również chcę przedstawić tę stronę informacyjną za pomocą animacji klapki.Jak zrobić animację klapki między dwoma kontrolerami UIView podczas kliknięcia przycisku informacji?

Kod do tworzenia przycisku INFO,

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

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

Gdybym kliknij przycisk informacji, metoda displayInfoView zostanie wywołana. Tam mogę pokazać UIView, aby wyświetlić niektóre informacje. Czy mam rację?

Dla przerzucania animacji, użyłem tego kodu ...

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

Tutaj loginPageView jest widok logowania, który zawiera przycisk INFO. infoView to widok zawierający informacje o aplikacji. mainView to popularny widok, który przechowuje bieżący widok.

Teraz mój problem polega na tym, że zamiast pokazywać UIView, mogę wyświetlić kolejną klasę kontrolera widoku, klikając przycisk informacji? Pamiętaj, że zmiana akcji działa dobrze z UIView. Ale kiedy próbuję z UIViewController, sprawia to kłopoty.

Czy ktoś może zasugerować mi, jak wyświetlić UIViewController (w mojej aplikacji, muszę pokazać AboutViewController), klikając przycisk informacji z efektem klapki?

Odpowiedz

5

Istnieje zasadnicza wada w zrozumieniu struktury MVC w Cocoa Touch, który jest, Zobacz Kontrolery i Odwiedzin są porównywalne i podobne. Prawdą jest, że nie są.

Wracając do konkretnego pytania, tak, animacje są oparte na widokach, a nie na kontrolerach widoku. Ale każdy widok powinien być kontrolowany przez jednego z kontrolerów widoku. A to, które-widok-należy-do-które-kontrolne rzeczy zależy całkowicie od ciebie. W twoim przypadku animacja może się zdarzyć między 2 widokami z 2 różnymi kontrolerami, lub też mogą wystąpić między 2 widokami tego samego kontrolera.

Jeśli chodzi o próbki kodu, proponuję przyjrzeć się jednemu z domyślnych szablonów Xcode, aplikacji Utility, która zaimplementowała tę animację typu "kliknij i zrób klapkę" w zwięzły i wystandaryzowany sposób.

+0

Dziękuję za odpowiedź. .. Próbuję wykonać animację między dwoma kontrolerami widoku.Nie widoki –

+0

To działa dobrze z viewcontroller i widokiem. Ale nie działa z dwoma kontrolerami widoku –

+1

Czy możesz edytować swój format kodu, aby móc go obejrzeć? Teraz format jest tak brudny, że nawet nie wiem, od czego zacząć. –

20

To jak ja to robię:

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

zasługa faysar here.

+1

Sterownik nawigacji ma całkiem jasny cel, podobnie jak kontrolery widoku modalnego. Po co używać jednego, aby osiągnąć cel innego? –

+1

Ponieważ wersja Michaela działa bez przerzucania 'UITabBar'. Kto zapytał o kontrolery widoku modalnego? – cheeesus

124

Aby odwrócić do kontrolera widoku:

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

Aby odwrócić od niego:

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

Myślałem, że potrzebuję kontrolera nawigacyjnego, dopóki nie przeczytam twojej odpowiedzi. –

0

proste linie kodu

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) 

    } 
Powiązane problemy