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)

用户喜欢...

虚幻引擎学习之路:动画模块之基础篇

之前我们陆续为大家详细介绍了Unreal 4引擎的渲染模块(包括光照系统、材质系统、相机后处理和全局光照明),接下来我们将讲解动画模块的基础功能。 动画模块是游戏引擎中的重要部分,...


第3章:配置自定义嵌入式Linux

配置一个硬件平台 Zynq-7000 下面是启动Linux所需要的硬件需求。 一个Triple Timer Counter (定时器) (必须) IMPORTANT: - 如果有多个定时器,Zynq-7000Linux内核将会自动使用设备树中第一个定时器。. - 请确...


iOS开发笔记 - 仿京东的加入购物车动画

请叫我死肥宅 之前APP里的加入购物车动画是最简单的UIView动画(一句代码那种),这几天正好有时间所以就跟产品那边确认优化了一下。虽然产品嘴上说让我自由发挥,但我相信没处理好肯...


真相了!动画演示陀螺仪的工作原理,一分钟弄懂

selina 在 周一, 10/23/2017 - 08:41 提交 最近听大牛的传感器同事的陀螺仪专业讲座,深入浅出的讲解让小编对陀螺仪的原理与应用有种顿悟赶脚,抽空整理部分内容,给对这个技术不太明了的小伙...


5个保持动画控制器整洁的小技巧

今天将为大家介绍5个非常实用的动画控制器的小技巧。为角色进行动画控制的过程和脚本非常相似,这需要动画控制器在整个开发周期内能够被高效率地进行重用、扩展、维护和故障排查。...


快速入门指南:使用 UIViewPropertyAnimator 做动画

iOS 10 带来了一堆非常有意思的新特性,例如 UIViewPropertyAnimator 。这是一个能够改善动画处理方式的新类。 它彻底改变了我们所习惯的工作流,为动画逻辑添加了一个更为精细的控制手段。...


让 Linux 接收来自 PL 的自定义中断信号

硬件连接 MPSoC 可以接收两组来自 PL 的中断信号。在 Vivado 中,可以通过 PS-PL Configuration -> General -> Interrupts -> PL to PS -> IRQ0/IRQ1 打开。 对应的硬件中断号分别是 PL PS Group 0: 121-128 PL PS Group 1: 1...


Pytorch学习笔记之自定义Module

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


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

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


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

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