iOS进阶4 -- 动画总结

iOS透明导航栏的平滑过渡(进阶版) 使用Category和Runtime来做到真正的透明导航栏,以及与不透明导航栏之间切换时的平滑渐变过渡效果 阅读详情

1.基础:逐帧 与 关键帧

逐帧动画:
类似于手绘翻页方式,我们可以将这个水杯在每帧画面中的位置一一找出来,这样实现动画的方式就叫作 逐帧动画,我们需要处理动画中的每一帧。

我们一般在计算机上用 FPS ( Frames Per Second) ,即 每秒的帧数 来表示动画的刷新速度,基于屏幕的刷新率等其他原因,在计算机上一般采用 60 FPS。
如果运动变化幅度较缓,减半到 30 FPS 时,我们肉眼也是可接受的。
较低的 FPS 会让我们有“卡顿”的感觉。

关键帧动画:
一个涉及数学和物理的问题:一个杯子初始位置在左边,n秒后匀速运动到右边,那么在每 1/60 秒的时候,这个杯子的位置显然是可以计算出来的了。
所以,我们其实只需要指定一些 关键 信息就能让计算机自己计算出每一帧杯子的位置了:

起始位置,比如一个坐标 (0,0)
结束位置,再比如一个坐标 (100,0)
动画总时间,比如 0.25 秒
匀速运动
这种方式就称之为 关键帧动画。即我们只需要给定几个关键帧的画面信息,关键帧与关键帧之间的过渡帧都将由计算机自动生成。

这里说的 关键帧动画,是指的广义上的一种动画制作方式,并不仅指 CAKeyframeAnimation,CABasicAnimation的实现方式也属于 关键帧动画

2.iOS 动画

一个动画的本质,就是动画对象(这里是 UIView)的状态,基于时间变化的反应了。简单说,就是给定任意一个时刻,如果你都能得到这个动画对象的位置和、形状等等属性,你就能实现这个动画了。
属性值的变化,既可能是位置、透明度、旋转角度等的变化,也包括形状的改变,比如从一条直线变化成一个圆圈,目标就是要得到变化过程中特定时刻的中间态。

iOS 的动画分为两大类:
系统提供的 关键帧动画 实现方式;用户指定 关键 信息,系统实现动画过程,对用户而言操作起来会简单些。
逐帧动画 实现方式;用户自己 画 出每一帧画面,系统操作方法简单,但用户操作的工作量就会大一些。

逐帧方法绘制:

简单的说,要实现逐帧的方式,就是需要 周期性 的调用 绘制 方法,绘制每帧的动画对象。

这里说的 绘制,不光是指覆写 UIView 的 - drawRect:的方法来手动重绘视图,也包括修改 UIView 它的属性,比如位置、颜色等。

iOS 的动画都是基于 CALayer 的,iOS 的 UIView 背后都有一个对应的 CALayer 。对 UIView 的修改实际上都是对背后 CALayer 的修改。
但如果在逐帧绘制的方法中修改了一个自建的 CALayer,这个 CALayer 不是对应某个 UIView 的,需注意系统的 隐式动画 的影响,后面会提到这点。

用逐帧方法绘制的原理不是很麻烦,麻烦的是绘制过程。
对于一个复杂动画,你可能需要运用各种物理、几何知识去计算视图中间状态的信息。
比如要实现一条直线卷曲变化为一个圆的动画,你就需要计算出中间态的曲线的弯曲程度和位置。

著名的 facebook 的 pop 动画框架,就是使用 CADisplayLink 这种逐帧绘制的方式实现的。

关键帧动画实现方式:
用 UIView 移动的简单例子。这里面有两个关键帧,起始帧和结束帧,除此之外还有2个关键信息:

起始帧,变化信息:坐标为 (0,0)
结束帧,变化信息:坐标为 (100,0)
动画时间,0.25秒
匀速运动
坐标 信息是 UIView 的一个属性(实际是对应到 CALayer 的属性),在动画实现里,我们只需要指定起始和结束的两个关键值就够了,中间的过渡值都有系统自动生成。
这里出现了两种值,一个是我们设定的,一个是系统生成的,所以要先在这里插入一个 模型层 和 展现层 的概念了

CALayer 的同一个属性值,会分别保存在模型层 modelLayer ,和展现层 presentationLayer 中。当我们修改属性值时,是修改的模型层的数值,动画时系统根据模型层的变化,生成的过渡值,是保存在展现层中的。

在 CALayer 的对象里能直接访问到这两层的信息。
而 CALayer 的底层实现实际不止这两层,但我们现在讨论动画的时候,可以只关心这两层。

在整个动画过程中,呈现出来的过程是这样的:
动画前,显示模型层的当前值;
动画开始,切换显示展现层的值;
动画过程中,展现层的值根据时间变化,我们看到的实际是展现层的值在变化;
动画结束,切换回显示模型层的值,此时模型层的值应被修改为动画结束时的值。
用一段代码来解释下动画过程。

 UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    view.backgroundColor = [UIColor redColor];
    [self.view addSubview:view];

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 0)];
    animation.toValue = [NSValue valueWithCGPoint:CGPointMake(150, 0)];
    [view.layer addAnimation:animation forKey:nil];

//    view.frame = CGRectOffset(view.frame, 100, 0);

你会发现动画结束后,view 又跳回了原来的位置,这是因为最后一行代码注释了,而这行代码的功能就是实现第4步,将模型层的值修改为动画结束时的值。

动画实现

代码中的 CABasicAnimation 就是真正的动画实现部分,也就是设定关键帧信息的地方。

将动画加入 CALayer 的代码定义为:

- (void)addAnimation:(CAAnimation *)anim forKey:(NSString *)key

接受的类型是 CAAnimation 类型,有下面这些子类:

CABasicAnimation,可设定起始结束两个关键帧的信息。
CAKeyframeAnimation,除首尾外,还可添加多个中间关键点。
CAAnimationGroup ,可组合多个动画,因为上面两种动画一次只能设置一个属性值。
CATransition,图层过渡动画,默认是淡入。比如修改一个 CALayer的背景色时,是从初始色慢慢淡入过渡到结束色。
可修改为新颜色把旧颜色顶出去等效果。还可使用 CIFilter 滤镜做过渡效果,一些开源 UIViewController 的过渡动画使用了这种方式。
uniapp iOS应用上架被拒4.3(a)问题解决方案 跨平台开发框架如uniapp在打包iOS应用时,常因二进制特征相似触发苹果的4.3(a)设计条款审核被拒。这源于框架生成的Mach-O文件携带了标准化的运行时特征代码,如JavaScriptCore执行环境和模块加载机制,导致静态分析工具检测到高相似度。解决这一技术痛点的核心在于代码混淆与原生层定制,通过Webpack的TerserPlugin进行标识符混淆、移除调试信息,并修改原生工程中的初始化逻辑和标准键值对。同时,差异化设计如自定义启动图和组件样式能有效提升应用独特性。这些工程实践不仅适用于uniap 阅读详情

相关推荐

IOS开发之——动画-转场动画(98)

专场动画属性及过渡效果示例(动画切换模拟转场动画)二 CATransition专场动画介绍nCATransition是CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点nUINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果三 专场动画属性及效果。

2401_84121897的博客 1181

Android 属性动画进阶总结篇(篇4)

前言:学习了郭霖大神的 属性动画高级用法相关的博客,在学习的同时也顺便做笔记1.在文章的开始首先贴上郭霖 大神关于 属性动画高级用法相关的博客地址: http://blog.youkuaiyun.com/sinyu890807/article/details/44171115 2.总结下所学习的技术点: 在篇2博文中记录了系统提供的一部分 “时间差值器”, 这里再深入学习下:系统默认的时间差值器 为 A

追求,成长 683

4、iOS 动画开发:从基础到进阶

本文详细介绍了iOS动画开发的基础知识和进阶技巧,涵盖SwiftUI和UIKit框架。内容包括动画的基本实现、可动画属性、动画选项、弹簧动画原理与实现,以及如何组合多种动画创建复杂场景。通过实例代码和挑战任务,帮助开发者掌握创建生动用户界面的技能。

pandas7gardener的博客 85

IOS开发之UI进阶(动画和核心动画)

动画 最基本的动画使用方式 //头尾式 //开启一个动画 [UIView beginAnimation:nil context:nil]; //设置动画执行时间 [UIView setAnimationDuration:2]; //=====中间是要执行动画的代码===== self.btnIcon.center=centerPoint; //=====中间是要执行动画的代码===== //执行动画 [UIView commitAnimations]; //Block式 [UIView anima

weixin_46926959的博客 833

11、iOS动画进阶:从层动画到弹簧动画

本文深入讲解了iOS动画的进阶内容,包括从基础的层动画到复杂的弹簧动画实现。涵盖了层动画的关键知识点,如设置动画代理、键值编码和命名动画;使用CAAnimationGroup创建动画组以及缓动模式、重复动画和改变动画速度等高级定时选项;以及层弹簧动画的原理和与UIKit弹簧动画的区别。通过具体示例和挑战任务,帮助开发者掌握如何为iOS应用创建丰富、逼真和自然的动画效果,从而提升用户体验。

pandas7gardener的博客 98

20、iOS动画:UIViewPropertyAnimator进阶指南

本文深入讲解了iOS中UIViewPropertyAnimator的高级用法,包括内置曲线动画、自定义贝塞尔曲线动画、弹簧动画、自动布局动画等。同时,还介绍了动画性能优化建议,并通过实际应用案例展示如何综合运用这些动画技术。适合希望提升iOS动画技能的开发者阅读。

pandas7gardener的博客 159

iOS核心动画CoreAnimation系统进阶(自定义转场动画)

想要实现自定义转场动画,需要分两个步骤 一.实现相关协议 @interface CustomTransitionViewController ()<UINavigationControllerDelegate> -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; self...

十二指环的博客 1963

Unity+Vuforia AR交互动画工程实战指南

AR交互动画是增强现实应用的核心能力之一,其本质是将虚拟内容与真实环境通过识别、跟踪、渲染、交互四层技术栈动态耦合。基于Unity引擎与Vuforia SDK的组合,开发者需深入理解动画状态机(Animator Controller)与AR生命周期(OnTrackingFound/OnTrackingLost)的协同机制,才能实现点击触发、手势缩放、语音响应等真实交互逻辑。该方案规避了传统教程中‘仅显示模型’的浅层Demo缺陷,强调可调试、可复刻、可扩展的工程化实践路径,适用于毕业设计、教学实训及轻量级AR

weixin_27960253的博客 291

iOS动画进阶 - CAKeyframeAnimation实现过山车动画

偶然间在网页上看到一个过山车动画觉得很炫,就想用swift纯代码实现了一个类似的效果,因为没有设计天赋,所以就完全高仿的人家的效果-.-下面上效果图: 给大家介绍一下项目中主要会用到的类: CAShapeLayer CAGradientLayer CAKeyframeAnimation 实现的主要思路渐变的背景用CAGradientLayer实现,其他例如山峰,草坪和轨道可以用CAShapeLaye

W_C__L的博客 7382

iOS动画进阶:使用CAAnimationGroup和动画定时

本章节介绍了如何使用CAAnimationGroup将多个动画组合在一起,实现同步和协调的动画效果。通过设置动画组的属性,简化了代码,并确保所有动画作为一个整体同步运行。同时,本章还探讨了如何通过CAMediaTimingFunction为动画添加缓动效果,以使动画看起来更加自然和流畅。此外,还介绍了重复动画、动画速度调整等高级定时选项,提供了对动画时间控制的深入了解。

weixin_30923011的博客 584

LabVIEW电压信号采集系统:从零搭建到科研实战

本文详细介绍了如何从零开始搭建一个基于LabVIEW的电压信号采集系统。内容涵盖硬件选型(如NI USB-6002数据采集卡)、软件环境配置、核心程序开发(包括多通道同步采集、数据自动保存)以及高级功能优化。系统支持自定义采样率与时长,并提供了完整的LabVIEW程序框图和配套的Python数据分析脚本,旨在帮助科研人员和工程师快速构建稳定、高效的专属数据采集方案,提升实验自动化水平。

gold8的专栏 461

[iOS UI进阶 - 2.4] 彩票Demo v1.4 转盘动画

A.需求 幸运广场界面中有一个幸运转盘,平时能够自动缓缓转动 能够选择星座 点击“开始选号”开速旋转转盘,旋转一定周数 转盘转动速度节奏:开始-慢-块-慢-结束 设置其余的背景和按钮 code source: 彩票Demo https://github.com/hellovoidworld/HelloLottery 转盘Demo https://github...

daxiguan0304的博客 246

汇川PLC程序框架设计:模块化分层与标准化实践指南

在工业自动化领域,可编程逻辑控制器(PLC)是设备控制的核心大脑。其编程质量直接决定了系统的稳定性、可维护性与开发效率。遵循高内聚、低耦合的软件工程原则,通过模块化分层设计,能够将复杂的控制逻辑分解为硬件驱动、设备控制、流程管理等清晰层级,并利用功能块(FB)封装可复用的设备控制逻辑。这种结构化方法的技术价值在于大幅提升代码的可读性、可测试性与团队协作效率,有效降低后期维护与功能迭代的难度。其应用场景广泛覆盖从单机设备到复杂产线的自动化项目。本文聚焦于汇川PLC平台,深入探讨如何构建一套融合了**状态机编程

weixin_29188997的博客 401

iOS开发相关书籍推荐

前言:技术书阅读方法论总结 下面是书单资源截图: 以下是每本书的推荐语,清楚自己缺的是什么,就下定决心去补吧,一个好工作意味着高收入,投资自己的时间换来更宝贵的东西。 一、网络层 1. 《HTTP权威指南(中文版)》 2. 《IOS网络高级编程》 二、架构、程序设计、编程思想 1.《OBJECTIVE-C编程之道 IOS设计模式解析》 2.《一线架构师实践指南(温昱)》 3.《Cocoa设计模式》 4.《Objective-C程序设计》 5.《kkbox-iOS-dev》 6.《Cocoa基.

FORMAT-qi的博客 2990

LSTM模型股价波动率预测(含Python代码)

源代码文件可在gzh’finance褪黑素'回复【24012203】获取。

celiaweiwei的博客 3775

从注册到投稿:一步步教你完成KBS期刊的在线投稿流程(最新版)

本文详细介绍了如何完成KBS期刊的在线投稿流程,从账号注册到最终提交的全过程。特别针对初次使用Elsevier投稿系统的研究者,提供最新版系统的操作指南,包括投稿要求、文件格式、作者信息管理等关键步骤,帮助研究者顺利投稿至这一人工智能领域的知名期刊。

egg99的博客 1599

如何做一个跟随键盘丝滑移动的聊天输入框?UIViewController-KeyboardAnimation 配合 Auto Layout 实战

UIViewController-KeyboardAnimation 是一个轻量的 iOS 键盘动画分类(Category),它帮你在键盘弹出/收起的瞬间,用系统一致的时长与曲线同步执行自定义动画,几行代码就能实现「聊天输入框跟随键盘丝滑移动」的效果。本文带你从零理解它的原理,并用 Auto Layout 实战搭出一个跟随键盘的输入框。 ## 痛点:为什么键盘动画总写不对? 做过聊天 App

gitblog_00648的博客 828

树莓派安装snowboy

1、树莓派换源 参考链接:https://blog.youkuaiyun.com/qq_43556844/article/details/113615915 2、更新pip3 参考链接:https://blog.youkuaiyun.com/qq_43556844/article/details/113616214 3、存取麦克风 我们使用PortAudio作为音频输入/输出的跨平台支持。我们还使用sox作为快速实用程序来检查麦克风设置是否正确。 sudo apt-get install python-pyaudio python

qq_43556844的博客 1923

IOS 复杂动画设计 (一)

IOS 动画开发设计 动画设计原则

kyl282889543的博客 1929

从后端角度浅谈抗辐射设计----三模冗余(TMR)

三模冗余设计(TMR),是最常用的一种容错技术,三个模块采取相同的操作,以多数相同的输出作为表决系统的正确输出,即3取2,因为三个模块是相互独立的,而其中两个模块同时出错的概率是极小的,因此便可保证系统输出的可信度。然而这个设计也会存在面积浪费,功耗的增加,而且由于是冗余的设计,在后续进行综合或者pr的时候会被工具优化,因此需要对模块进行don’t touch设置;通过增值表得到,逻辑关系表达式为:Q=(Q1&Q2)|(Q1&Q3)|(Q2&Q3),通过工艺库的stdcell进行搭建,得到如下电路。

芯冰乐 327

OsgEarth —— 笔记1 - 创建地球的earth文件

效果         正文      1、准备一张全球的渲染图(tif格式)、一张全球的高程图(tif格式)        2、创建并编写.earth文件           在步骤1目录下创建china-simple.earth,并将如下内容写入。 <map name="Globe" type="geocentric" version="2"> <!-- 全球影像图 --> <image name="GlobeImage" driver="gdal"> &l

7681

【iOS进阶】之深入浅出理解和使用 Core Animation的隐式动画

目录 1 何为隐式动画 1.1特点 1.2 隐式动画如何进行?何时产生? 2 开发者如何利用隐式动画 2.1 CATransaction 没有实例方法,只有类方法。 2.2 UIView的动画方法的实现 3 UIView与隐式动画那若即若离的关系 3.1 CALayer的隐式动画如何产生? 3.2 UIView如何禁用其layer的隐式动画 4 控制UIView或CALayer...

jifaliwo123的博客 1119

【RT-DETR有效改进】为什么YOLO版本的RT-DETR训练模型不收敛精度差的问题

本文的内容同样为本专栏的前期预热文章,文章主要解释一下为什么有的人跑ultralytics仓库的RT-DETR精度很差,模型不收敛,mAP异常的情况。为了验证这一情况我也是跑了多个实验,从多个数据集出发,100-500的数据集我跑了大概5个数据集,1000的我跑了二个,2000的我跑了一个,4000的跑了一个,同时其中一些版本我也用了不同的batch_size来出发验证精度异常的情况。

Snu77的博客 9762

iOS 显式动画

###如果想让事情变得顺利,只有靠自己 – 夏尔·纪尧姆 上一章介绍了隐式动画的概念。隐式动画是在iOS平台创建动态用户界面的一种直接方式,也是UIKit动画机制的基础,不过它并不能涵盖所有的动画类型。在这一章中,我们将要研究一下显式动画,它能够对一些属性做指定的自定义动画,或者创建非线性动画,比如沿着任意一条曲线移动。 如果你依然在编程的世界里迷茫,不知道自己的未来规划,小编给大家推荐一个...

qq2899926939的博客 347

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

iOS动画进阶 - 手摸手教你写ShineButton动画

前段时间在github上看见一个非常nice的动画效果,可惜是安卓的,想着用swift写一个iOS版的,下下来源代码研究了一下,下面是我写代码的心路历程 先上图和demo的地址分析动画过程刚开始看的时候感觉这个动画很炫酷,实现起来应该挺复制的,后来我将gif图逐一分解,大致浏览了一下安卓的实现过程,大致了解的实现的过程,下面是一些关键的动画步骤: 第一步是里面图片的缩放动画,使用CALayer配合C

W_C__L的博客 7828

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SnapKit动画终极指南:5个简单步骤实现流畅的iOS界面动画效果

SnapKit作为iOS开发中最强大的Auto Layout框架,能够帮助开发者轻松实现复杂的界面布局和流畅的动画效果。这款开源库通过优雅的DSL语法,让约束动画变得简单直观,彻底告别繁琐的frame动画时代。😊 ## 为什么选择SnapKit实现动画效果? 传统的frame动画在适配不同屏幕尺寸时存在诸多限制,而SnapKit的约束动画能够完美解决这些问题: - **自动适配**:支持所

gitblog_00209的博客 995

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: swift闭包学习
下一篇: CALayer及动画
Even_DC
博客等级 码龄12年 18粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值