IOS中如何模拟UINavigationController的Slide动画


在IOS中,UINavigationController在添加(push)与删除(pop)View的时候,会加入Slide的动画。有时候,在需要自己进行模拟这个动画的时候,会比较麻烦。

通常,可以使用CATransition来使用Push效果,基本代码如下:

CATransition *transition = [CATransition animation];

transition.duration = 0.3f;

transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

transition.type = kCATransitionPush;

transition.subtype = kCATransitionFromRight;

transition.fillMode = kCAFillModeBackwards;

transition.speed = 0.5f ;

transition.removedOnCompletion = YES;

[self.view.layer removeAllAnimations];

[self.view.layer addAnimation:transition forKey:nil];


上面是Push的代码,Pop的时候,只要将 subtype改为 kCATransitionFromLeft

但是,使用CATransition的Push的时候,ios会将旧的view在推进中,进行Fade的处理。由于有这样的一个过程,会造成屏幕的闪白,而且与原来的UINavigationController的动画不一致。

要解决这个问题,只有使用暴力的方法,这个方法就是,先将原来的View进行截屏,生成一个UIImageView,再将这个UIImageView与新的View进行横向的平移动画,在动画结束之后,再将新的UIImageView进行删除。

截屏的代码:

UIGraphicsBeginImageContext(viewController.view.bounds.size);

CALayer *layer = viewController.view.layer;

[layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage*image =UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return image ;

再使用UIView的animation来实现,

[UIViewbeginAnimations:nilcontext:nil];

[UIViewsetAnimationDuration:0.35f];

[UIViewsetAnimationDelegate:self];

[UIViewsetAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

[UIViewsetAnimationCurve:UIViewAnimationCurveEaseInOut];

imageView.origin = CGPointMake(imageView.origin.x-screenRect.size.width, imageView.origin.y) ;

maskImageView.origin = CGPointMake(maskImageView.origin.x-screenRect.size.width, maskImageView.origin.y);

[UIViewcommitAnimations];

长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn