close
当前位置: 物联网在线 > 技术文库 > ios >

iOS 自定义转场动画浅谈

路漫漫其修远兮,吾将上下而求索

iOS 自定义转场动画浅谈

开门效果.gif

前记

想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差不多有10天的时间,终于对转场动画了解了一点。自从 iOS 7 以后,我们就可以自定义转场动画,实现我们想要的效果,在这之前,我们先来看一张图,大概了解下,需要知道些什么

相关类联系图

iOS 自定义转场动画浅谈

Paste_Image.png

相信各位看官也差不多看完这张图了,下面我们就来简单了解下其中的类和相关的函数

说到转场动画,其实无非就是我们常用的 push pop present dismiss 四种动画,其中前面两个是成对使用,后面两个成对使用,我们先看看 push 这组在自定义转场动画中所涉及到的类

由于 push 动画组需要配合 navigationController 来使用,所以上图中的 UINavigationControllerDelegate 肯定是我们需要的类

UINavigationControllerDelegate

先来看看其中需要用到的函数

- (nullable id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>) animationController NS_AVAILABLE_IOS(7_0); - (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC NS_AVAILABLE_IOS(7_0);

第一个函数的返回值是一个 id <UIViewControllerInteractiveTransitioning> 值

第二个函数返回的值是一个 id <UIViewControllerAnimatedTransitioning> 值

那么我们就先从这两个返回值入手,来看下两个函数的作用

UIViewControllerInteractiveTransitioning 、UIPercentDrivenInteractiveTransition

这两个类又是干什么的呢? UIPercentDrivenInteractiveTransition 遵守协议 UIViewControllerInteractiveTransitioning ,通过查阅资料了解到, UIPercentDrivenInteractiveTransition 这个类的对象会根据我们的手势,来决定我们的自定义过渡的完成度,也就是这两个其实是和手势交互相关联的,自然而然我们就想到了 iOS 7 引进的侧滑手势,对,就是侧滑手势,说到这里,我就顺带介绍一个类, UIScreenEdgePanGestureRecognizer ,手势侧滑的类,具体怎么使用,后面我会陆续讲到。

涉及函数

//更新进度 - (void)updateInteractiveTransition:(CGFloat)percentComplete; //取消转场 回到转场前的效果 - (void)cancelInteractiveTransition; //完成转场 - (void)finishInteractiveTransition;

UIViewControllerAnimatedTransitioning

在这个类中,我们又看到了两个函数

//转场时间 - (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext; - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;

其中又涉及到一个新的类 UIViewControllerContextTransitioning ,那么这个又是干什么的呢?我们等下再来了解,先来谈谈第一个函数 transitionDuration ,从返回值我们可以猜测出这是和时间有关的,没错,这就是我们自定义转场动画所需要的时间

那么下面我们就来看看 UIViewControllerContextTransitioning

UIViewControllerContextTransitioning

这个类就是我们自定义转场动画所需要的核心,即转场动画的上下文,定义了转场时需要的元素,比如在转场过程中所参与的视图控制器和视图的相关属性

//转场动画的容器 @property(nonatomic, readonly) UIView *containerView; //通过对应的`key`可以得到我们需要的`vc` - (UIViewController *)viewControllerForKey:(UITransitionContextViewControllerKey)key //转场动画完成时候调用,必须调用,否则在进行其他转场没有任何效果 - (void)completeTransition:(BOOL)didComplete

看到这里,我们现在再去看 UINavigationControllerDelegate 中的两个函数和 UIViewControllerAnimatedTransitioning 中的 animateTransition 函数,就能完全理解了

//主要用于手势交互转场 for push or pop - (nullable id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>) animationController NS_AVAILABLE_IOS(7_0); //非手势交互转场 for push or pop - (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC NS_AVAILABLE_IOS(7_0); //实现转场动画 通过transitionContext - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;

到此,我们还有一个类没有了解,那就是 UIViewControllerTransitioningDelegate 有了前面的分析,我们可以很好的理解

UIViewControllerTransitioningDelegate


(责任编辑:ioter)

用户喜欢...

Pytorch学习笔记之自定义Module

pytorch 是一个基于 python 的深度学习库。pytorch 源码库的抽象层次少,结构清晰,代码量适中。相比于非常工程化的 tensorflow,pytorch 是一个更易入手的,非常棒的深度学习框架。 对于系统学习...


谷歌确认Android Wear支持自定义表盘

自始至终,Android平台都以高度开放的自定义而闻名。各个厂商都为了让用户得到更好的体验,都为自己的Android设备开发出不同的UI。作为安卓智能手表平台,Android Wear当然也会支持第三方企...


(译)Android:创建可穿戴应用 - 自定义布局

创建自定义布局(Creating Custom Layouts) 本文将介绍如何创建自定义通知以及使用可穿戴UI库来创建自定义布局 你同时还需要了解可穿戴设计准则(Wear Design Principles) 除了屏幕尺寸和瞬读能力...


Cocos2d-x 3.0开发(六)使用cocoStudio创建一个骨骼动画

1、概述 现在我们已经会使用静态的UI控件了,接下来我们再研究一下动画的使用。 效果图: 2、创建资源层 打开CocoStudio,这次在初始界面上选择”AnimationEditor”(第一个)进入编辑器并创建...


Cocos2d-x 3.0 开发(七)在程序中处理cocoStudio导出动画

1、概述 使用cocoStudio可以方便的制作动画,接下来的工作就是在我们的程序中使用制作的动画。这篇中,我将使用程序将两个动画连接起来。有图有真相: 2、制作动画 承接上一篇,我们再制...


Cocos2d-x 3.0 开发(八)骨骼动画的动态换肤

1、 概述 游戏中人物的状态会发生改变,而这种改变通常要通过局部的变化来表现出来。比如获得一件装备后人物形象的改变,或者战斗中武器、防具的损坏等。这些变化的实现就要通过动态...


[Unity3D]Unity3D游戏开发之基于Trigger的触发式动画设计

相信大家在安装完Unity3D后做的第一件事情一定是浏览官方的示例项目《愤怒的机器人》,这个游戏在场景渲染及光照阴影特效等方面都有不错的表现。那么不知道大家还记不记得这样一个场...


Unity3d的2D骨骼动画插件Puppet2D的使用1

开发Cocos2d的程序员都知道,Cocostudio其中一个动画编辑组件中的。骨骼动画对于游戏开发的性能上是很好的,有些时候和序列帧动画相比。 强大的unity3d虽然也可以开发2D游戏,可以序列帧实现...


手把手课堂:如何为Xilinx设计创建创建自定义XBD文件

创建自定义赛灵思板级描述(XBD)文件不仅有助于节省时间,而且还能确保设计项目按计划推进。为您设计的任意开发板创建一个XBD文件并非难事。 FPGA厂商推出了许多出色的评估板和专用开...


Cocos2d-x之自定义控件ScrollBar的设计

我们在使用cocos2dx的TableView和ScrollView的时候,如果要显示的内容非常多,我们不方便确认当前浏览的内容处于什么位置,也不方便快速浏览。这时我们需要一个滚动条来帮忙,但cocos2dx里面没...