iOS 仿小红书的 push pop转场动画

文章编号:467 技术教程 2024-04-24 iOS 仿小红书的 push pop转场动画

iOS 7之后,苹果提供了自定义转场动画的API,我们可以自己去定义任意动画效果。本篇为笔者学习push、pop自定义转场效果的笔记,如何有任何不正确或者有指导意见的,请在评论中留下您的宝贵意见!!!

本篇只讲其中的UIViewControllerAnimatedTransitioning协议,来实现push、pop动画效果。另外的几个,后面会继续学习总结!!!

我们要实现push、pop自定义转场效果,我们必须要有一个遵守了UIViewControllerAnimatedTransitioning协议且实现其必须实现的代理方法的类。

下面我们先了解下协议:
@protocol UIViewControllerAnimatedTransitioning

// This is used for percent driven interactive transitions, as well as for container controllers that have companion animations that might need to
// synchronize with the main animation.
//
// 指定转场动画时长,必须实现,否则会Crash。
// 这个方法是为百分比驱动的交互转场和有对比动画效果的容器类控制器而定制的。

  • (NSTimeInterval)transitionDuration:(nullable id)transitionContext;
  • iOS仿小红书的pushpop转场动画

// This method can only be a nop if the transition is interactive and not a percentDriven interactive transition.
// 若非百分比驱动的交互过渡效果,这个方法只能为空

  • (void)animateTransition:(id)transitionContext;

@optional

// This is a convenience and if implemented will be invoked by the system when the transition context's completeTransition: method is invoked.

  • (void)animationEnded:(BOOL) transitionCompleted;

@end
下面是具体的实现,
---------自定义push动画-----------
//转场过渡的容器view
UIView *containerView = [transitionContext containerView];

//FromVC
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIView *fromView = fromViewController.view;
[containerView addSubview:fromView];

//ToVC
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *toView = toViewController.view;
[containerView addSubview:toView];
toView.alpha = 0;

//过渡的图片
UIImageView *transitionImgView = [[UIImageView alloc] initWithImage:self.transitionImgView.image];
transitionImgView.frame = self.transitionBeforeImgFrame;

[transitionContext.containerView addSubview:transitionImgView];

[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
    transitionImgView.frame = self.transitionAfterImgFrame;
    toView.alpha = 1;
} completion:^(BOOL finished) {
    [transitionImgView removeFromSuperview];
    BOOL wasCancelled = [transitionContext transitionWasCancelled];
    //设置transitionContext通知系统动画执行完毕
    [transitionContext completeTransition:!wasCancelled];
}];

------------自定义pop动画----------
//转场过渡的容器view
UIView *containerView = [transitionContext containerView];

//ToVC
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *toView = toViewController.view;
[containerView addSubview:toView];

//图片背景的空白view (设置和控制器的背景颜色一样,给人一种图片被调走的假象)
UIView *imgBgWhiteView = [[UIView alloc] initWithFrame:self.transitionBeforeImgFrame];
imgBgWhiteView.backgroundColor = [UIColor clearColor];
[containerView addSubview:imgBgWhiteView];

//有渐变的白色背景
UIView *bgView = [[UIView alloc] initWithFrame:containerView.bounds];
bgView.backgroundColor = [UIColor whiteColor];
bgView.alpha = 1;
[containerView addSubview:bgView];

//过渡的图片
UIImageView *transitionImgView = [[UIImageView alloc] initWithImage:self.transitionImgView.image];
transitionImgView.frame = self.transitionAfterImgFrame;
transitionImgView.layer.cornerRadius = 20;
transitionImgView.alpha = 0.3;
transitionImgView.layer.masksToBounds = YES;
[transitionContext.containerView addSubview:transitionImgView];

[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
    transitionImgView.frame = self.transitionBeforeImgFrame;
    bgView.alpha = 0;
} completion:^(BOOL finished) {
    BOOL wasCancelled = [transitionContext transitionWasCancelled];
    [imgBgWhiteView removeFromSuperview];
    [bgView removeFromSuperview];
    [transitionImgView removeFromSuperview];
    
    //设置transitionContext通知系统动画执行完毕
    [transitionContext completeTransition:!wasCancelled];
}];

分析Push动画

我们暂不细说UIViewControllerContextTransitioning协议,我们这里只使用到了-containerView这个代理方法,我们可以通过苹果提供的键来获取对应的控制器:
ViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
获取到了fromVC,也就是当前要从哪个控制器切换。
然后通过:
DetailController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
获取到了toVC,也就是切换到哪一个控制器。
然后再通过
UIView *containerView = [transitionContext containerView];
获取containerView视图。这个是一个代理方法,可以获取到视图容器。

下面我们获取fromVC所点击的图片控件,然后通过-snapshotViewAfterScreenUpdates:将所点击的图片控件截图并用于切换使用,参数设置为NO,否则动画会很生硬。最后,我们还要将这个所点击的图片控件的坐标转换成容器视图的坐标.
UIView *toImageView = toVC.imgView;
fromImageView.hidden = YES;
toVC.view.alpha = 0.0;
toImageView.hidden = YES;

下面这两行是非常关键的,并且必须保证tempView在最上层,否则动画效果就没有了。先将目标控制器的视图添加到容器中,再添加源图片的截图到容器中,用于显示切换效果。
[containerView addSubview:toVC.view];
[containerView addSubview:tempView];
我们在动画中,将初始的截图的frame改变成最终的效果的frame即可达到我们的目标效果。另外要注意还需要将坐标转换成容器的坐标:
tempView.frame = [toImageView convertRect:toImageView.bounds toView:containerView];
当动画完成以后,一定要调用:[transitionContext completeTransition:YES],设置切换动画已经完成,否则想要pop回去就不能了。
pop和push差不多,这里就不赘述了。
如需demo,请留言。


本文地址: https://www.r22.cn/jishuwz/467.html
逸云源码网

逸云源码网-手游源码,端游源码,页游源码,服务端,架设教程,GM交流

心语阁 - 温暖分享与心灵成长

心语阁是一个致力于温暖分享与心灵成长的平台。我们提供一个倾诉、倾听和启发内心的空间,让人们能够在这里分享彼此的心情、经历和感悟。通过心语阁,您可以与他人建立深层次的连接,寻找到共鸣和支持。我们的目标是为每个人带来心灵的抚慰、成长的启示和力量的传递。加入心语阁,与我们一起探索内心的世界,感受分享的温暖。

食用菌商务网-食用菌产业专业门户网站|食用菌网|食用菌栽培技术

中国食用菌商务网是全球食用菌专业门户网站,是服务于中国食用菌产业的一个全方位的网络商务平台,集食用菌资讯、食用菌供求和食用菌技术为一体,发布最新的国内、国际食用菌行业新闻,食用菌市场最新价格变动和海量供应、求购信息,食用菌栽培技术、工厂化、病虫害防治、储藏加工以及食用菌新技术,为食用菌企业和菇农提供一个宝贵的食用菌产品供求、信息共享平台。

舟孜糯

舟孜糯|贰收网|物业租赁管理系统|公寓出租房管理系统|远程预付费电能管理|远程预付费电能管理|房屋租赁缴费管理系统|远程预付费水电表|预付费电表|预付费水表|抄表系统|远程抄表系统|智能电表抄表系统|预付费抄表系统|电表预付费管理系统|

贵州别墅智能车库门,贵阳车库卷帘门, 贵阳PVC快速卷帘门,工业滑升门厂家-贵州黑曼巴智能装备工程有限公司

贵州黑曼巴智能装备工程有限公司(电话:13511960874)主营:高端别墅智能车库门、中高端智能车库卷帘门、PVC快速卷帘门、快速堆积门、工业提升门、螺旋门、工厂直接定制,价格批发厂家!

飞扬PDF转换器 -100% 免费-高效便捷的PDF转换Word|JPG|PPT转换器

此外,还提供PDF的分割与合并、文件压缩、图片提取、密码移除,以及多种电子书格式的转换服务。同时支持批量转换文档,实现高效的一键转换功能。

平阳县雾丁百货商行

pos机人工客服电话:4006582019,pos机官网提供银联正规个人pos机免费办理代理加盟,各个pos机器费率上调咨询,哪个pos费率最低最划算?pos靠谱吗怎么样?银联pos机如何办理?本站为你提供一站式服务!

互动网

该站点未添加描述description...

上海社会科学院

上海社会科学院为上海综合性人文和社会科学研究机构,是中华人民共和国最早建立的社会科学院,是首批国务院学位委员会批准的学位授予单位。上海社会科学院创建于1958年,由当时的中国科学院上海经济研究所和上海历史研究所、上海财经学院、华东政法学院、复旦大学法律系合并而成。据2018年8月上海社科院官网显示,社科院设有17个研究所、12个管理部门、6个直属单位和17个院直属研究中心;拥有在职工作人员约760人。

恒科汽配网-原重汽配件网-专业的重型汽车配件信息网站

恒科汽配网,原重汽配件网官方网站,重型汽车配件的行业网站,提供汽配采购、重汽,陕汽,北奔,欧曼,川汽,矿车,潍柴,徐工,三一等重型卡车配件价格信息,维修资料以及厂家和供应商信息。

超能指标站_每日新的财经生活资讯网

超能指标站,时刻关注宏观经济、房产、教育、科技、生活、政策等领域的关键指标和资讯,为用户提供全面、专业、时效性新的资讯服务。