iOS自定义 Transitions 动画总结

打造类似iOS的Android Activity切换动画效果 本文还有配套的精品资源,点击获取 简介:在Android开发中,为提升用户体验,实现类似iOS的平滑Activity切换动画成为开发者的追求。此项目深入探讨如何利用Android动画系统,包括属性动画、Activity Transitions、共享元素过渡等技术,来创建流畅的界面过渡效果。开发者将学习如何自定义动画,优化性能和布局,以及通过异步加载技术确保数据加载与动画流畅... 阅读详情

在iOS中,当导航控制器调用 [navigationController pushViewController:secondViewController animated:YES]时,系统会提供一个过渡的动画来提高用户体验。另外,一个控制器present(或者dismiss)另一个控制器时([self presentViewController:secondViewController animated:YES completion:NULL])系统也会提供相应的过渡动画。为了使app交互效果更加精彩,iOS为我们提供了在不同场景下自定义过渡动画以及通过手势控制过渡进度的实现方案。效果先看这个demo效果。

自定义 Transitions 动画的效果由实现了UIViewControllerAnimatedTransitioning协议的实例定制; 手势控制过渡进度由实现了UIViewControllerInteractiveTransitioning协议的实例定制。在不同的Transition场景下, 我们通过不同的代理方法向系统提供自定义的遵守UIViewControllerAnimatedTransitioning协议的对象和遵守UIViewControllerInteractiveTransitioning协议的对象。 知道如何将自己定义的UIViewControllerAnimatedTransitioning对象以及UIViewControllerInteractiveTransitioning对象提供会给系统;并且知道如何实现UIViewControllerInteractiveTransitioning协议以及实现UIViewControllerInteractiveTransitioning协议, 你就可以自如的实现自己的Transition动画了。


一,自定义Transitions动画使用场景

1, 一个控制器present另一个控制器的自定义转换动画

这种场景在调用[self presentViewController:secondViewController
animated:YES completion:NULL]
和 [self
dismissViewControllerAnimated:YES completion:NULL];
时产生。实现步骤如下:

(1) 对被present的控制器设置transitioning代理对象 secondViewController.transitioningDelegate = presentationController; presentationController是实现协议UIViewControllerTransitioningDelegate 的实例。 同时设置secondViewController . modalPresentationStyle = UIModalPresentationCustom;

(2) 代理对象要实现UIViewControllerTransitioningDelegate 协议的方法,在代理方法中返回遵守UIViewControllerAnimatedTransitioning协议和UIViewControllerInteractiveTransitioning协议的对象。

@protocol UIViewControllerTransitioningDelegate <NSObject>
@optional
//返回用于present的自定义transition动画。
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;
//返回用于dismiss时的自定义transition动画。
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed;
//返回用于present时的可进行手势交互的transition动画。
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator;
//返回用于dismiss时的可进行手势交互的transition动画。 
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator;
//这个在自定义PresentationController时使用。下面的sample code有相应demo.
- (nullable UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(UIViewController *)presenting sourceViewController:(UIViewController *)source NS_AVAILABLE_IOS(8_0);
@end

2, UINavigationController 中控制器的transition

这种场景在[navigationController pushViewController:secondViewController animated:YES]和[self.navigationController popViewControllerAnimated:YES];下产生。实现步骤如下:

(1) 设置 导航控制器的delegate : self.navigationController.delegate = self;

(2) 实现代理方法, 在代理方法中返回实现UIViewControllerAnimatedTransitioning,和UIViewControllerInteractiveTransitioning(手势控制切换过程)协议的对象。

//返回可用于进行手势交互的transition动画。 
- (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);

3, UITabBarController中切换控制器的transition

在默认情况下,UITabBarController切换控制器是没有过渡动画效果的。通过自定义Transitiond动画为切换控制器加上过渡效果。其实现步骤如下:

(1) 设置 UITabBarController实例的代理对象: self.tabBarController.delegate = self; 代理对象必须遵守UITabBarControllerDelegate协议。

(2) 实现代理方法如下代理方法, 在代理方法中返回遵守相应协议的对象。

- (nullable id <UIViewControllerInteractiveTransitioning>)tabBarController:(UITabBarController *)tabBarController interactionControllerForAnimationController: (id <UIViewControllerAnimatedTransitioning>)animationController NS_AVAILABLE_IOS(7_0);

- (nullable id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
                animationControllerForTransitionFromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC  NS_AVAILABLE_IOS(7_0);

二,实现协议UIViewControllerAnimatedTransitioning

- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext{
    //返回执行转换控制器的时长
}

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{
    /**
    (1), 从transitionContext 获取执行动画需要的信息例如
         UIView *containerView = transitionContext.containerView;
         UIView *fromView;
         UIView *toView;

    (2),将toView 添加到containerView  中(所有的要执行的动画都需要在这里面完成)
    (3),执行动画
     [UIView animateWithDuration:transitionDuration
                     animations:^{
                         //在这里执行一些动画
                     } completion:^(BOOL finished) {
                         //动画结束后,一定要调用
                         BOOL wasCancelled = [transitionContext transitionWasCancelled];
                         [transitionContext completeTransition:!wasCancelled];
     }

     */
}
}

三,实现协议 UIViewControllerInteractiveTransitioning

- (void)startInteractiveTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
    //在这里做些初始化的操作    
    [super startInteractiveTransition:transitionContext];
}

注意:
(1) 在获取UIViewControllerAnimatedTransitioning的代理方法中,如果有返回实现UIViewControllerAnimatedTransitioning协议 的对象, 那么就使用customer transition; 如果返回nil, 就使用系统默认的效果。
(2) 在获取 UIViewControllerInteractiveTransitioning的代理方法中, 如果返回实现UIViewControllerInteractiveTransitioning协议的对象, 那么transition过程就是通过手势控制的; 如过返回nil,就直接转换。


四, 使用手势控制Transition 的大致流程

将手势识别器添加到合适的view上, 根据监听到的手势的状态做出相应操作

switch (gestureRecognizer.state)
    {
        case UIGestureRecognizerStateBegan:
            /**
             监听到手势开始,触发transition。 也就是调用下面的某个方法
             [self.navigationController pushViewController:secondViewController animated:YES];(导航控制器中, 或者pop)
             或者[self presentViewController:secondViewController animated:YES completion:NULL];(presentViewController, 或者dismiss)
             或者[tabBarController setSelectedIndex:2];(tabBarController )
             */

            break;
        case UIGestureRecognizerStateChanged:
            /**
             更新进度
             */
            [self updateInteractiveTransition:[self percentForGesture:gestureRecognizer]];
            break;
        case UIGestureRecognizerStateEnded:
            // Dragging has finished.
            // Complete or cancel, depending on how far we've dragged.
            //根据进度决定是finishInteractiveTransition 还是 cancelInteractiveTransition 。
            if ([self percentForGesture:gestureRecognizer] >= 0.5f)
                [self finishInteractiveTransition];
            else
                [self cancelInteractiveTransition];
            break;
        default:
            // Something happened. cancel the transition.
            [self cancelInteractiveTransition];
            break;
    }

五,Sample Code

具体代码与理论相结合往往事半功倍。推荐给大家一些比较好的Sample Code.

IOS转场动画_OC语言写的 资源是OC的语言 , 不是swift ! 不是swift ! 不是swift ! 下载之后直接用xcode打开 , ViewControl.m里面已经集成好 , buttonClicked方法是那个图片的点击事件 还有很多种动画 可以自行开发 立即下载

相关推荐

逆向实战:Soul聊天协议加密与Frida绕过检测技术解析

本文详细解析了Soul聊天协议的逆向工程实战,重点介绍了使用Frida绕过检测技术的具体方法。通过IDA和JADX进行静态分析,结合Frida动态调试,揭示了数据加密与解密的核心逻辑,并提供了完整的逆向工作流和实用技巧,帮助开发者深入理解协议逆向过程。

weixin_29260291的博客 926

IOS手机系统 transition css3动画不执行

注:要加上translateX translateZ。ios 动画transition不执行。

qq_43383334的博客 1722

保姆级教程:用ROS2 Humble + Gazebo Classic 从零搭建一个能键盘控制的差分AGV模型

本文提供了一份详细的ROS2 Humble与Gazebo Classic教程,指导用户从零开始搭建一个键盘控制的差分AGV模型。内容涵盖环境配置、Xacro文件设计、Gazebo仿真集成以及键盘控制实现,特别针对常见问题提供解决方案,帮助开发者快速掌握ROS2机器人仿真技术。

weixin_30387423的博客 169

iOS transition转场动画

转场动画 我们需要自定义一个遵循的协议的动画过渡管理对象,并实现两个必须实现的方法. //返回动画事件 - (NSTimeInterval)transitionDuration:(nullable id)transitionContext; //所有的过渡动画事务都在这个方法里面完成 - (void)animateTransition:(id)transitionContext; 我们还需要自定义一个继承于UIPercentDrivenInteractiveTransition的手势过渡管理对象

MemoryFate的博客 634

从时序迷宫到稳定通信:FSMC配置中的时间参数深度解析与实战避坑指南

本文深入解析STM32 FSMC配置中的时间参数,特别是AddressSetupTime和DataSetupTime的实战配置技巧。通过STM32F407连接SRAM的实际案例,提供从理论计算到CubeMX配置的全流程指南,帮助开发者避免常见时序陷阱,确保稳定通信。

nginx7reverse的博客 84

重访时间与覆盖分析的stk操作

1.打开stk 2.创建一个新的场景,命名为Test,选择地球为场景星球,若为金星,可在Central Body里选择Venus(金星自转周期慢,自转周期243天,卫星轨道变化不明显)(其中start stop时间可设置长一些) 3.插入一个AreaTarget或者place,以AreaTarget为例 选择Pattern,Add三个点(用法可见前面的博客,有时候编程的代码也可以帮助理解stk的操作) 4.插入Satellite,选择Orbit Wizard(若想设置卫星的六根数也可

weixin_42664107的博客 1万+

iOS 页面跳转过渡类型

过渡类型(Transition)是从一个场景切换到另一个场景时播放的动画。 四种setModalTransitionStyle风格 UIModalTransitionStyleCoverVertical 从底部滑入 UIModalTransitionStyleFlipHorizontal,水平翻转进入 UIModalTransitionStyleCrossDissolve,交叉溶解 UIMod

SoulKey的博客 3041

【硬件】通俗易懂的讲解晶体管(三极管和MOS管)的工作原理

晶体管是一个简单的元器件,可用于构建许多有趣的项目。在本文中,我将用通俗易懂的语言给您讲解晶体管的工作原理,以便您可以在电路设计中更好的使用静态管。一旦你学习这些基础知识,对以后的设计和使用来说,将会变得非常容易。我们将重点介绍两种最常见的晶体管:双极型晶体管(三极管)和MOSFET。晶体管的工作原理其实是类似于电子开关。它可以打开和关闭电路。一个简单的思考方法是将晶体管视为无源的继电器。晶体管类似于继电器,从某种意义上说,您可以使用它来打开和关闭某些东西。但晶体管也可以部分导通,一般在放大电路中使用,这部

1万+

iOS自定义转场(custom transition)

iOS中,从一个也没切换到另一个页面的效果叫转场(transition)。UINavgationController、UIViewController默认的转场效果有时不能满足项目的要求,需要我们创造新的效果,这就需要用到自定义转场啦!          自定义的步骤:     1、准备两个UIViewController,通常是从presentdingViewController(简写pr

蔡兵的专栏 1518

在PyCharm中配置使用Anaconda环境

在PyCharm中配置使用Anaconda环境一、步骤1.Anaconda2.PyCharm总结 一、步骤 1.Anaconda 如未安装Anaconda可至其官网下载,学习使用个人版就可以了。 下载地址:https://www.anaconda.com/products/individual 1、打开Anaconda Navigator,点击Environments可以看到anaconda中已经有了默认的“base”环境,其中包含了大多数我们会用到的包,在PyCharm中可以直接使用该环境,而无需自行下载

TuckX的博客 19万+

iOS面试题大全(附带答案)

C语言相关面试题 1.static有什么用途? 答案:在C语言中,static主要定义全局静态变量,定义局部静态变量,定义静态函数。 static 属于静态变量,使用它修饰的变量生命周期是整个源程序。 @1.在函数体内的 static 变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; @2.在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外其它函数访问; @3.在模块内的 static 函数只被这一模块内的其它函数调用,这个函数的使用范围被限

IOSNF的博客 2426

Swift 4 动画 - 1. UIView Animations

所有示例代码均可以在 Animations-Demo 下载到 iOS 中实现动画有好几种方式,UIView 无疑是最简单的一种,但是所有的动画归根结底还是 layer 层的动画。UIView 层面的动画只是对 layer 层部分属性的封装。我们可以直接对 UIView 的 alpha 、bounds 、center 、frame、transform、backgroundColor(如果vie...

C 1867

【RT-DETR实战】RT-DETR实战手记(200):端侧实时目标检测,下一步往哪儿走?

昨天深夜调一个模型部署,在树莓派4B上跑RT-DETR-nano,帧率死活卡在8FPS上不去。量化也做了,算子也优化了,内存对齐也检查了,可就是离实时检测的底线还差一截。盯着终端里跳动的数字,突然意识到——我们可能正在接近当前技术路径的瓶颈。端侧实时目标检测的下一个突破口,恐怕不在现有框架的修修补补里。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 186

iOS BUG: Unbalanced calls to begin/end appearance transitions for <XXXViewController: 0x7fcea3730650...

自定义TabBarController Push下一级Controller时 会报这样的错误:Unbalanced calls to begin/end appearance transitions for <XXXViewController: 0x7fcea3730650>. 网上的一些回答,都说是动画引起的,解决方法就是,加一个BOOL型的变量,检查是否在做动画...

dfgwang1202的博客 263

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

iOS 自定义视图控制器转场示例教程

iOS 自定义视图控制器转场示例教程 本教程基于 TeehanLax/UIViewController-Transitions-Example 开源项目,旨在展示如何利用 iOS 7 新增 API 创建自定义的视图控制器过渡效果。通过这个项目,您可以学习到如何替换系统默认的动画,实现更加丰富和交互式的转场体验。 1. 项目介绍 iOS 自定义视图控制器转场示例 是一个演示如何在 iOS 7 及以后...

gitblog_01193的博客 1013

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Unbalanced calls to begin/end appearance transitions for <IDOOrderHomeViewController: 0x8da2960>.

自定义TabBarController Push下一级Controller时 会报这样的错误:Unbalanced calls to begin/end appearance transitions for <UIVIewController>. 网上的一些回答,都说是动画引起的,解决方法就是,加一个BOOL型的变量,检查是否在做动画。 if (transi...

weixin_30840253的博客 90

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Pow:用SwiftUI动画库提升iOS应用交互体验的完整指南

在当今移动应用竞争激烈的环境中,用户对界面交互的期望越来越高。一个流畅、响应迅速的动画效果往往能决定应用的使用体验是否令人愉悦。Pow作为一个专为SwiftUI设计的动画效果库,为开发者提供了丰富的预置动画效果,让应用交互从功能实现提升到情感体验的层次。 --- ## 项目定位:为什么你的SwiftUI应用需要专业动画库? 传统的SwiftUI动画开发往往面临两个困境:要么过于简单难以创造令

gitblog_00594的博客 24

iOS 动画三:transitions 动画

转场动画 transitions 前两节,我们学习了怎样基于属性(eg. postion 及 alpha)创建动画,但是如果我们想在增加与删除 view 的时候进行动画该怎么办呢? 本节我们讲讲 transitions 动画,它可以解决上面提出的问题。 transitions 是可以应用于 views 的预定义动画。这些预定义动画不会尝试在视图的开始和结束状态之间插入。相反,我们可以自定义动画,使...

weixin_33717298的博客 193

ViewController Transitions——非交互式自定义Modally转场动画

非交互式自定义Modally转场动画

weixin_46908889的博客 507

Readest 翻页动画深度解析:基于 View Transitions 的 Push/Slide/Curl 与 Tauri 原生 Mesh Curl 实现

Readest 是一套跨平台开源电子书阅读器,其「翻页动画」能力围绕 `pageTurnStyle` 视图设置展开,提供 Push(推送)、Slide(滑动)、Curl(卷页)三种风格。本文基于仓库中记录该特性完整演进历程的设计笔记([page-turn-styles-viewtransitions-555.md](https://link.gitcode.com/i/484b7b006ad4e6

gitblog_00091的博客 451

手机玩 Minecraft Java 版指南:PojavLauncher 配置与用法完整手册

PojavLauncher 是一个面向 Android 设备的开源 Minecraft Java 版启动器,让原本只能在电脑上运行的 Java Edition 客户端直接在手机里跑起来。它适合想在移动设备上玩正版及模组化 Java 版的老玩家,也适合想研究"桌面 JVM 应用如何移植到 Android"的开发者。 ## 🖼️ 一图速览:手机上的 Java 版是什么效果 [![PojavLau

gitblog_01130的博客 874

iOS开发者必学:ImageOpenTransition多图动画的完整实现方案

ImageOpenTransition是一款基于Swift开发的iOS视图控制器过渡动画库,专注于实现ViewController之间图片的精美转场效果。作为iOS开发者,掌握这款轻量级动画框架能让你的App界面交互瞬间提升一个档次,为用户带来流畅自然的视觉体验。 ## 🎨 什么是ImageOpenTransition? ImageOpenTransition是一个专为iOS平台设计的视图控

gitblog_00859的博客 775

Unbalanced calls to begin/end appearance transitions for <> 自定义tabbar问题

自定义Tabbar,nav push后出现警告: Unbalanced calls to begin/end appearance transitions for 一个动画没有执行结束,下一个动画就开始了。 解决办法 自定义tabbar实现如下方法 问题即可解决: -(void)viewWillAppear:(BOOL)animated {     [self.selected

huaixiaohai1210的博客 2283

GGUF、imatrix、mmproj傻傻分不清?Qwen3.5-4B-Artemis-GGUF六种文件详解

Qwen3.5-4B-Artemis-GGUF 仓库里一共有 6 个 `.gguf` 文件:三个是可直接运行的量化模型,一个是量化用的 imatrix 重要性矩阵,两个是支持图片输入的 mmproj 视觉文件。本文面向新手,逐个讲清楚每个文件是什么、多大、要不要下载、怎么运行,看完不再混淆。 ## 📦 30秒总览:六种文件一张表看懂 | 文件 | 大小 | 角色 | 要不要下载 | | --

gitblog_00320的博客 1087

使用Scenes和Transitions实现View动画

用户界面经常随着用户输入和其他事件而改变。例如,当用户输入查询条件并提交后可以隐藏查询表单。 为了在这些情况下使视觉上连续,我们可以使用动画来实现。这些动画可以给用户操作反馈并且帮助他们了解你的应用是怎么工作的。 Android包含transitions框架,可以很容易就让我们在两个view之间实现动画。这个框架在运行时随着时间改变它们的属性值来实现动画。它包含了内置的一些常用动画效果,你也可以创建自定义动画和回调。 这篇文章介绍了如何使用transitons框架的内置动画来实现动画和自定义动画。

Jason的专栏 387
上一篇: swift 高仿爱鲜蜂
下一篇: iOS高效调试
hejunm
博客等级 码龄12年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值