2012-03-22 11 views
10

Jestem prawie początkującym użytkownikiem Xcode 4. Istnieje sposób na dodanie do grupy niestandardowej animacji przejścia, która nie znajduje się wśród czterech przedstawionych przez Konstruktor interfejsów w serii ujęć zarządzanie? W szczególności chcę animacji podobnej do normalnej "okładki pionowej", ale poziomej. Chcę, aby widok przechodził na inny przesuwany od lewej do prawej (lub od prawej do lewej), zamiast od góry do dołu, jak to się dzieje w przejściu "przykrywka pionowa". Próbowałem gestem machnięcia, ale bez fortuny: nawet to przechodzi z góry na dół, i tak dalej, nie rozumiem, dlaczego przesunięcie przejścia jest od dołu do góry, gdy domyślne przejście całej aplikacji zwykle jest od prawej do lewej lub od lewej do prawej, w szczególności w przypadku zrobić przesuń ...Animacja iOs Segue od lewej do prawej (poziomo)

próbowałem też programowo sposób, ale nie fortunę nawet w tym przypadku, przy użyciu tego kodu:

#import "JHCustomSegue.h" 

@implementation JHCustomSegue 
- (void) perform { 
    UIViewController *src = (UIViewController *) self.sourceViewController; 
    UIViewController *dst = (UIViewController *) self.destinationViewController; 

    [UIView transitionWithView:src.navigationController.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ 
     [src presentModalViewController:dst animated:NO]; 
    } 
    completion:NULL]; 
} 

@end 

w konstruktora interfejsu zdefiniowałem to klasa jako klasa mojej segue. Używając breakpointa, zobaczyłem, że wchodzi on w funkcję perfom, ale ... nie wykonuj! Zablokowałem aplikację w trybie pionowym (nie wiem, czy to problem). Próbowałem uruchomić aplikację na prawdziwym iPadzie i na symulowanym iPhonie. Taki sam problem.

Odpowiedz

19

Możesz użyć CATransition w niestandardowym segmencie, aby uzyskać przejście od lewej do prawej. Dodaj #import „QuartzCore/QuartzCore.h” do zwyczaju Segue

-(void)perform { 

__block UIViewController *sourceViewController = (UIViewController*)[self sourceViewController]; 
__block UIViewController *destinationController = (UIViewController*)[self destinationViewController];      

CATransition* transition = [CATransition animation]; 
transition.duration = .25; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade 
transition.subtype = kCATransitionFromLeft; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom 



[sourceViewController.navigationController.view.layer addAnimation:transition 
              forKey:kCATransition]; 

[sourceViewController.navigationController pushViewController:destinationController animated:NO];  


} 
+0

Czy to możliwe, że ekran przesuwa się od dołu? Użyłem tego samego kodu jako niestandardowej segue i robi to dokładnie to, o czym wspomniałem. –

+0

Dowiedziałem się, gdzie jest problem. Jest krajobrazowy i działa jak portret. –

+0

możesz użyć kCATransitionFromBottom dla transition.subtype. zobacz tutaj https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CATransition_Class/Introduction/Introduction.html –

2

Próbowałem użyć Segue, aby zrobić ten sam efekt, ale bez powodzenia. Zamiast tego skorzystałem z obejścia:

// get the view that's currently showing 
UIView *currentView = self.view; 
// get the the underlying UIWindow, or the view containing the current view 
UIView *theWindow = [currentView superview]; 

UIView *newView = aTwoViewController.view; 

// remove the current view and replace with myView1 
[currentView removeFromSuperview]; 
[theWindow addSubview:newView]; 

// set up an animation for the transition between the views 
CATransition *animation = [CATransition animation]; 
[animation setDuration:0.5]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:kCATransitionFromRight]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView2"]; 

Możesz pobrać przykładowy projekt here. Twoje zdrowie!

+0

o, dziękuję bardzo! Wypróbuję to jak najszybciej! –

+0

Coś, co przegapiłem, aby dodać, jeśli znalazłeś sposób, aby to zrobić z Segue, daj nam znać. =) – justinkoh

+0

nie, do tej pory :) Myślę jednak, że możliwa jest większa współpraca z kontrolerami nawigacyjnymi. Jak tylko będę mógł, poświęcę temu trochę czasu. –

8

Oto kod roboczych dla niestandardowego seque gdy nie jest używany kontroler nawigacyjny.

-(void)perform 
{ 

UIViewController *sourceViewController = (UIViewController*)[self sourceViewController]; 
UIViewController *destinationController = (UIViewController*)[self destinationViewController]; 

CATransition* transition = [CATransition animation]; 
transition.duration = 0.25; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
transition.type = kCATransitionMoveIn; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade 
transition.subtype = kCATransitionFromRight; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom 

[destinationController.view.layer addAnimation:transition forKey:kCATransition]; 
[sourceViewController presentViewController:destinationController animated:NO completion:nil]; 
} 
+0

Co by to wyglądało w Swift? –

9

oparciu o poddaniu zakir Hyder, oto jest taka sama funkcjonalność tłumaczone Swift:

override func perform() { 

    var sourceViewController = self.sourceViewController as UIViewController 
    var destinationViewController = self.destinationViewController as UIViewController 

    var transition: CATransition = CATransition() 

    transition.duration = 0.25 
    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 
    transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade 
    transition.subtype = kCATransitionFromLeft; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom 

    sourceViewController.navigationController?.view.layer.addAnimation(transition, forKey: "kCATransition") 
    sourceViewController.navigationController?.pushViewController(destinationViewController, animated: false)  

} 
+0

Jaki byłby ten kod w Swift, gdyby nie używanie kontrolera nawigacyjnego? –

3

Sprawdź ten przykład na Github:

https://github.com/itinance/iOSCustomSegue

wykorzystuje niestandardowy segue od prawej do lewej w przykładowej aplikacji jawnie bez UINavigationController jako pytający otwierający wątek.

Kod w odpowiedzi Sahil nie zadziałał dla mnie na iOS 8. Musiałem więc zbadać trochę więcej na ten temat.

"UIView animateWithDuration" działa na iOS 8, podczas gdy "destinationAplikacja.playler.view.layer addAnimation: transition" nic nie robi w połączeniu z presentViewController.

Powiązane problemy