2012-03-22 3 views
10

Я почти новичок в Xcode 4. Есть способ добавить к пользовательской анимации перехода, которая не входит в число четырех представленных интерфейсом Builder в раскадровке управление? В частности, мне нужна анимация, похожая на обычную «вертикальную покровную», но горизонтальную. Я хочу, чтобы представление переходило к другому, перемещаясь слева направо (или справа налево), а не вверх, как это происходит при переходе «по вертикали». Я пробовал с жестом салфетки, но не фортуны: даже если это происходит из-за дна, и в любом случае, я не понимаю, почему переход от дефолтов происходит снизу, когда переход по умолчанию на все приложение обычно имеет право налево или слева направо, особенно в случае, если вы проводите ...iOs анимация Segue слева направо (по горизонтали)

Я попытался также способ программно, но не состояние даже в этом случае, используя этот код:

#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 

в интерфейсе строителем я определил это класс как класс моего segue. Используя точку останова, я увидел, что он входит в функцию, но ... не выполняет! Я заблокировал приложение в портретном режиме (не знаю, если это проблема). Я попытался запустить приложение на реальном ipad и на смоделированном iphone. Та же проблема.

ответ

19

Вы можете использовать CATransition в пользовательском Segue для достижения перехода слева направо. Добавить #import «QuartzCore/QuartzCore.h» для пользовательских 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

Возможно ли, что экран выдвигается снизу? Я использовал этот код в качестве пользовательского segue, и это делает именно то, о чем я упоминал. –

+0

Я узнал, в чем проблема. Это пейзаж, и он действует так, как будто это портрет. –

+0

вы можете использовать kCATransitionFromBottom для перехода. см. здесь https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CATransition_Class/Introduction/Introduction.html –

2

Я попытался использовать Segue, чтобы сделать тот же эффект, но безуспешно. Вместо этого я использовал обходной путь:

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

Вы можете загрузить образец проекта here. Ура!

+0

о, большое спасибо! я попробую это как можно скорее! –

+0

Что-то, что я пропустил, было, если бы вы нашли способ сделать это с Segue, дайте нам знать. =) – justinkoh

+0

нет, до сих пор :) Я думаю, однако, что можно работать с навигационными контроллерами. Как только я смогу, я посвящу этому время. –

8

Вот рабочий код для заказа seque, если не используется навигационный контроллер.

-(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

Что это будет выглядеть в Swift? –

9

на основе представления Закира Хайдер, вот такая же функциональность переведены на 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

Как выглядит этот код в Swift, если не используется контроллер навигации? –

3

Заканчивать этот пример на Github:

https://github.com/itinance/iOSCustomSegue

Он использует пользовательский SEGUE справа налево в примере приложения явно без UINavigationController в качестве раскрывающегося потока, в котором запрашивается.

Код в ответе Сахила не работал для меня в iOS 8. Поэтому мне пришлось исследовать немного по этому вопросу.

«UIView animateWithDuration» работает на iOS 8, а «destinationController.view.layer addAnimation: transition» ничего не делает в сочетании с presentViewController.

Смежные вопросы