先上效果图:

效果图

细心的小伙伴会发现,现在 网易云音乐的广告页 以及 微信相册中点击查看评论 都用了该转场动画。作为一名 iOS 程序员,本能的想去实现它。

说明:本篇博文参考了 onevcat 的 WWDC 2013 Session笔记 以及 GitHub 上的开源项目。不打算先理论了,直接拿 demo 项目开撸。

项目结构

很显然,有两个 ViewController,在本例中分别是 MainViewController(下文简称 mainVC) 和 ForwardViewController(简称 forwardVC)。

首先,我们让 mainVC 声明 UIViewControllerTransitioningDelegate 协议,并实现 - (id )animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;方法。

该方法需要你返回一个自定义的动画,该动画类型为 NSObject ,并需要实现 UIViewControllerAnimatedTransitioning 协议。

因此,接下来我们需要实现这样一个实现 UIViewControllerAnimatedTransitioning 协议的 object,不妨取名为 NeteaseTransitionAnimation。

实现 NeteaseTransitionAnimation

在本例中,我们着重看 UIViewControllerAnimatedTransitioning 协议中的两个方法,一是 - (NSTimeInterval)transitionDuration:(nullable id )transitionContext;,第二个是 - (void)animateTransition:(id )transitionContext。

第一个方法传入动画的时间长度,在这里我们设置为 0.8 秒,我们主要在第二个方法中设定具体的动画效果。

第二个方法中有一个很重要的 UIViewControllerContextTransitioning 类型的上下文对象 transitionContext,通过该对象我们可以获得切出以及切入的 VC 从而设置动画的具体参数等。不多说,接下来直接上具体实现步骤及相应代码。

获得切出和切入的 ViewController

UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

获得 containerView 并将待切入的 view 加入其中

UIView *containerView = [transitionContext containerView];

[containerView addSubview:toVC.view];

有人问,containerView 是用来干嘛的。官方定义: * The view that acts as the superview for the views involved in the transition. * 。并且,它会自动的将当前所在的 viewController 的 view 加入其中。

使用 CATransform3D 实现动画过程

这步应该算是本篇中最核心的一步。关于涉及到的动画知识,建议先看iOS 核心动画高级技巧中的 3D 变换这一章,在本篇博文中就不具体谈了。

代码:

CATransform3D transform = CATransform3DIdentity;

transform.m34 = -0.002; // 设置透视效果,一般设为 -0.002

[containerView.layer setSublayerTransform:transform]; // 将动画影响到父视图下的所有子视图

CGRect initialFrame = [transitionContext initialFrameForViewController:fromVC];

toVC.view.frame = initialFrame; // 给 toVC 设置初始 frame

让我们重新看一下开头的效果图,可以将整个动画过程分成 3 个阶段。(假设我们将一个周期的总时间设为 t,并规定逆时针转动为正,顺时针转动为负,逆顺指针均从视角的正上往正下看)

0 阶段

fromVC 初始在原位,而 toVC 初始化在 pi / 2 的位置。见图:

具体代码:

toVC.view.layer.transform = CATransform3DMakeRotation(M_PI_2, 0.0, 1.0, 0.0);

0 ~ t / 2 阶段

fromVC 顺时针从 0 度转到 - pi / 2 的位置,toVC 在 pi / 2 位置保持不动。(这时在视觉上二者重合)

t / 2 ~ t 阶段

toVC 从初始的 pi / 2 位置顺时针转到 0 位置。

0 ~ pi 阶段的具体代码:

[UIView animateKeyframesWithDuration:duration delay:0.0 options:0 animations:^{

[UIView addKeyframeWithRelativeStartTime:0.0

relativeDuration:0.5

animations:^{

fromVC.view.layer.transform = CATransform3DMakeRotation(- M_PI_2, 0.0, 1.0, 0.0);

}];

[UIView addKeyframeWithRelativeStartTime:0.5

relativeDuration:0.5

animations:^{

toVC.view.layer.transform = CATransform3DMakeRotation(0.0, 0.0, 1.0, 0.0);

}];

} completion:^(BOOL finished) {

[transitionContext completeTransition:![transitionContext transitionWasCancelled]];

}];

值得提一下 [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; ,如果没有取消动画的话,即为 [transitionContext completeTransition: YES]。在该方法中,* UIKit will ensure the final state is consistent and remove the fromView from the container. * ,即,在我们这里,该方法将会移除 fromVC.view 。

结尾

该动画源码已上传 GitHub,链接戳此。有问题可以提 issue 或者直接在本博文下方的评论框中进行评论。

其实该动画并不难,建议对着源码多比较,并按 option + 函数名 查看官方定义,会很有收获的。

参考链接也不另给了,基本都是 Apple 官方的文档,没有什么资料比官方文档更有说服力了。

联系我

HTML网易云音乐首页动画,仿网易云音乐广告页的转场动画相关推荐

  1. 史上最牛逼的音乐播放器—仿网易云音乐(已开源)

    前言:音乐播放器倒见过不少,做到几乎和官方网易云音乐安卓版差不多的,还是头第一回见.aa112901 的这款仿网易云音乐安卓版客户端,很多地方值得我们学习.无论是下载模块,还是换肤模块,还是炫丽的UI ...

  2. 仿网易云音乐html代码,仿网易云音乐外链播放器UI的HTML5音乐播放器插件

    简要教程 APlayer是一款仿网易云音乐外链播放器UI的HTML5音乐播放器插件.APlayer音乐播放器可以自定义歌曲封面,可以自定义同步歌词等,界面时尚大方,是一款非常好的HTML5音乐播放器插 ...

  3. html5自动播放音乐外链,仿网易云音乐外链播放器UI的HTML5音乐播放器插件

    APlayer是一款仿网易云音乐外链播放器UI的HTML5音乐播放器插件.APlayer音乐播放器可以自定义歌曲封面,可以自定义同步歌词等,界面时尚大方,是一款非常好的HTML5音乐播放器插件. 安装 ...

  4. 仿网易云android界面,Android - 仿网易云音乐歌单详情页

    前段时间模仿网易云音乐UI使用DataBinding做了一个App:CloudReader,今天把其中的类似歌单详情页单独拿出来说一下,我觉得其中还是有些干货的,关联到的知识点还比较有价值,而且也有很 ...

  5. iOS仿写有妖气漫画、视频捕获框架、启动页广告页demo、多种动画效果等源码

    iOS精选源码 以tableview的section为整体添加阴影效果/ta'b'le'vi'e'w顶部悬浮-. 一个可以轻松应用自定义过滤器的视频捕获框架. 基于UITableView的组件,旨在显 ...

  6. iOS仿写有妖气漫画、视频捕获框架、启动页广告页demo、多种动画效果等源码...

    iOS精选源码 以tableview的section为整体添加阴影效果/ta'b'le'vi'e'w顶部悬浮.... 一个可以轻松应用自定义过滤器的视频捕获框架. 基于UITableView的组件,旨 ...

  7. activity 转场动画不生效_replugin插件化,插件转场动画失效的问题解决

    说明 随着应用功能的丰富,Android程序的安装包也逐渐变大,这成为应用程序现有框架下难以摆脱的瓶颈.所以引入了rePlugin插件化框架,将应用按功能拆分为插件,以此减小apk的大小并同时增加应用 ...

  8. 使用vue实现自己音乐播放器仿网易云 移动端 (audio、播放、暂停、上一首、下一首、展示评论、音量控制、进度条拖拽)

    最终实现成果展示 源码地址 在线演示地址 - 网抑云音乐 1.播放 暂停功能的实现 这是audio标签 <audio @timeupdate="updateTime" @ca ...

  9. web音乐系统 javaweb音乐网站 低仿网易云音乐网站项目 期末课设 课设项目

    在一筹莫展的搞期末课设时,看到了这个up主的项目,简直是神仙下凡!!! 视频链接:https://www.bilibili.com/video/BV1i4411K7g4/?spm_id_from=33 ...

  10. android 转场动画兼容问题,【Android】关于ARouter转场动画的问题

    实现从主页跳转到搜索页,再从搜索页回退主页 withTransition(int resId,int resId) 这个方法两个参数 第一个的意思是, A 到 B, B 的入场动画 第二个的意思是,A ...

最新文章

  1. Android广播监听usb插拔状态
  2. 通用数组(练习,可能有错)
  3. 如何在C#Windows控制台应用程序中更新当前行?
  4. Python爬虫入门教程 33-100 《海王》评论数据抓取 scrapy
  5. Yii框架中使用SRBAC作为权限管理模块时遇到的问题
  6. python 概率分布_python实现beta分布概率密度函数的方法
  7. 如果我用你待我的方式来待你 恐怕你早已离去
  8. ibatis resultclass java.util.list_mybatis 动态sql返回一个List封装类报错求解决方法
  9. 测试Flex代码覆盖率工具---FlexCover
  10. Spark : ContextCleaner清理器
  11. 开发者应该关注的五项Web新兴技术:WebGL和SVG名列其中
  12. c语言编程智能交通灯系统,智能交通灯控制系统的研究
  13. Ant下载安装及使用详解
  14. 如果你不释放MogaFX外汇,你将无法获得交易或投资
  15. 【RMF】ros机器人中间件框架学习系列一:了解原理
  16. 大唐波斯将军 机器人_波斯帝国被阿拉伯所灭,末代王子三次求助大唐,为何唐朝没有出兵...
  17. 关于开源许可证的介绍
  18. 38 --> 详解 OpenWRT RESET按键、键盘响应逻辑
  19. js删除不符合条件的数据(对象数组)
  20. 扫描线+线段树简介 AcWing 248窗内的星星题解

热门文章

  1. [工具] IntelliJ IDEA 中文语言包插件
  2. 「Mac小技巧」教你如何解决WiFi的国家地区代码冲突
  3. 人才网运营之填充数据心得之骑士人才系统用火车头职位采集规则填充人才网数据
  4. 主板开启网络唤醒_主板远程唤醒设置
  5. flash builder4.6安装
  6. 遇到没有exe文件的驱动
  7. html5页面登录页面,html5练习——登录页面
  8. win10资源管理器打开缓慢,自动搜索
  9. 【学习笔记】文献检索课程总结
  10. HUSTOJ搭建2021