<span style="font-weight: bold; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:14px;">自定义push,pop动画</span></span>
<span style="font-weight: bold; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:14px;"> </span></span>
<span style="font-weight: bold; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:14px;">一,将pop,push的animated置为no,将导航控制器view的显现方式加上动画:(相当于自定义动画区覆盖转场动画)</span></span>
<span style="font-weight: bold; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:14px;"> </span></span>
1,CATransition *transition = [CATransition animation];//定义一个动画对象
2,transition.duration = 1.0f;//间隔时间
3,transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];//动画的开始与结束的快慢
4, transition.type = kCATransitionFade;//动画效果
5,transition.subtype = KCATransitionFromRight;//动画方向;
6,[navigationController.view.layer addAnimation:transtion forKey :nil];//在需要添加动画的view层上添加此代码
7, setType 的属性有:
1,KCATransitionFade 淡出
2, KCATransitionMoveIn 覆盖原图
3,KCATransitionPush 推出
4,KCATransitionReveal 底部显出来
8,用字符串设置动画类型
1,pageCurl 向上翻一页
2,pageUnCurl 向下翻一页
3, rippleEffect 滴水效果
4,suckEffect 收缩效果,如一块布被抽走
5,cube 立方体效果
6,oglFlip 上下翻转效果
二,执行io7推出的代理方法,自定义转场动画
1,新建一个类继承于NSObject,命名为pushHelper用于push动画,pophelper用于pop动画
使它遵守<UIViewControllerAnimatedTransitioning>
2, 实现该协议的两个方法
1)- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
<strong><span style="font-size:18px;">{ return 0.3; }//返回的是动画的持续时间,一般是0.2到0.4</span></strong>
<pre code_snippet_id="464571" snippet_file_name="blog_20140905_1_8919567" name="code" class="objc" style="line-height: 24px;"><strong><span style="font-size:18px;">2)这是动画转场的主要方法</span></strong>
<strong><span style="font-size:18px;">- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
// 获取到目的控制器
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
// 获取源控制器
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
// [transitionContext containerView] 是转场容器,如果不把目的控制器的view添加进去,那么动画执行完成之后,toviewcontroller的view就会消失,因为动画就是在这个容器里面完成的,完成之后没有view自然什么都没有了,需要添加,这样便于理解,
[[transitionContext containerView] addSubview:toViewController.view];
toViewController.view.alpha = 0.0;</span></strong>
<strong><span style="font-size:18px;">//开始动画
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
// 动画效果有很多,这里就展示个左偏移
fromViewController.view.transform = CGAffineTransformMakeTranslation(-320, 0);
toViewController.view.alpha = 1.0;
} completion:^(BOOL finished) {
// 声明过渡结束-->记住,一定别忘了在过渡结束时调用 completeTransition: 告诉系统已经编译完成
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}</span></strong>
<strong><span style="font-size:18px;">3,实现动画</span></strong>
<strong><span style="font-size:18px;">1,你的fromviewController同样需要遵守<UINavigationControllerDelegate></span></strong>
<pre code_snippet_id="464571" snippet_file_name="blog_20140905_2_4764702" name="code" style="line-height: 16px;"><strong><span style="font-size:18px;">- (id<UIViewControllerAnimatedTransitioning>) navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { /** * typedef NS_ENUM(NSInteger, UINavigationControllerOperation) {// * UINavigationControllerOperationNone, * UINavigationControllerOperationPush, * UINavigationControllerOperationPop, * }; */这里的operation可以判断当前的动作是push还是pop if (operation == UINavigationControllerOperationPush) {</span></strong>
<strong><span style="font-size:18px;">(这里返回有遵守了动画协议并在里面编写的动画的类对象) return pushhelper; }else{ return pophelper; } } </span></strong>
<span style="font-size:14px;"></span>