iOs Segue 动画从左到右(水平)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9826420/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
iOs Segue animation left to right (horizontal)
提问by Sasha Grievus
I'm nearly a newbie to Xcode 4. There's a way to add to a segue a custom transition animation that it is not among the four presented by the Interface Builder in the storyboard management? Specifically, i want an animation similar to the normal "cover vertical", but horizontal. I want the a view to pass to another sliding from left to right (or right to left) instead that from up to bottom as it happens in the "cover vertical" transition. I tried with the swipe gesture but no fortune: even that is transitioning from up to bottom and anyway, i don't understand why the defaul transition is from up to bottom when the default transition of all the app usually is right to left or left to right, especially in the case you do swipe...
我几乎是 Xcode 4 的新手。有一种方法可以将自定义过渡动画添加到 segue 中,它不在故事板管理中 Interface Builder 提供的四个动画中?具体来说,我想要一个类似于正常的“垂直覆盖”但水平的动画。我希望视图从左到右(或从右到左)传递到另一个滑动,而不是从上到下,因为它发生在“覆盖垂直”过渡中。我尝试了滑动手势但没有运气:即使是从上到下过渡,无论如何,我不明白为什么当所有应用程序的默认过渡通常是从右到左或左时,默认过渡是从上到下向右,尤其是在您滑动的情况下...
I tried also a programatically way but no fortune even in this case, using this code:
我也尝试了一种编程方式,但即使在这种情况下也没有运气,使用以下代码:
#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
In the interface builder i defined this class as the class of my segue. Using breakpoint, i saw it enter the function perfom but... don't perform! I've blocked the app in portrait mode (don't know if it's a problem). I tried to run the application on a real ipad and on a simulated iphone. Same Problem.
在界面构建器中,我将这个类定义为我的 segue 类。使用断点,我看到它进入了函数 perfom 但是...不要执行!我在纵向模式下阻止了该应用程序(不知道是否有问题)。我尝试在真实的 ipad 和模拟的 iphone 上运行该应用程序。同样的问题。
回答by Zakir Hyder
You can use CATransition within a custom Segue to achieve left to right transition. Add this #import "QuartzCore/QuartzCore.h" to your custom Segue
您可以在自定义 Segue 中使用 CATransition 来实现从左到右的过渡。将此 #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];
}
回答by Tim Walsh
Based on Zakir Hyder's submission, here is the same functionality translated to Swift:
根据 Zakir Hyder 的提交,这里是翻译到 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)
}
回答by Sahil
Here is the working code for custom seque when not using navigation controller.
这是不使用导航控制器时自定义序列的工作代码。
-(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];
}
回答by itinance
Check out this Example on Github:
在 Github 上查看此示例:
https://github.com/itinance/iOSCustomSegue
https://github.com/itinance/iOSCustomSegue
It uses a custom segue from right to left in an example app explicitly without UINavigationController as the thread opener where asking for.
它在示例应用程序中从右到左使用自定义 segue 明确没有 UINavigationController 作为请求的线程开启器。
The Code in the answer of Sahil didn't work for me at iOS 8. So i had to investigate a little bit more on this issue.
Sahil 回答中的代码在 iOS 8 上对我不起作用。所以我不得不对这个问题进行更多调查。
'UIView animateWithDuration' works on iOS 8, while 'destinationController.view.layer addAnimation:transition' does nothing in combination with presentViewController.
'UIView animateWithDuration' 在 iOS 8 上工作,而 'destinationController.view.layer addAnimation:transition' 与 presentViewController 结合使用什么都不做。
回答by justinkoh
I tried using Segue to do the same effect too, but without success. Instead, I used a workaround:
我也尝试使用 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"];
You can download the sample project here. Cheers!
您可以在此处下载示例项目。干杯!