也许是工作上并没有这方面的需要,对UIDynamicAnimator的了解不多。这里做简单的介绍;
UIKit动力学是模拟真实世界的一些特性,主要就是UIDynamicAnimator类,通过类中的不同行为实现一些动态特性;
1、初始化
UIDynamicAnimator有两种初始化方式;
1 | let animator = UIDynamicAnimator ( referenceView : self . view ) |
self.view表示一个参照试图,用来规定物理仿真的范围
1 | animator = UIDynamicAnimator . init ( collectionViewLayout : < # T ## UICollectionViewLayout # > ) |
不是任何对象都能做物理仿真,能够进行物理仿真的元素需要遵守UIDynamicItem协议,UIView遵守了该协议,所以任何UI控件都能进行物理仿真。
UICollectionViewLayoutAttributes类默认也遵守UIDynamicItem协议,所以也可以进行仿真
2、物理仿真行为
UIDynamicAnimator有以下几种物理仿真行为:
UIGravityBehavior:重力行为
UICollisionBehavior:碰撞行为
UISnapBehavior:捕捉行为
UIPushBehavior:推动行为
UIAttachmentBehavior:附着行为
UIDynamicItemBehavior:动力元素行为
将物理仿真行为添加到仿真器上开始进行仿真操作;
3、UIDynamicAnimator的常见方法
1 2 3 4 5 6 7 8 | //添加一个物理行为 animator . addBehavior ( < # T ## behavior : UIDynamicBehavior ## UIDynamicBehavior # > ) //移除一个物理行为 animator . removeBehavior ( < # T ## behavior : UIDynamicBehavior ## UIDynamicBehavior # > ) //移除全部物理行为 animator . removeAllBehaviors () |
4、实际使用(以推动行为为例)
1 2 3 4 | animator . removeAllBehaviors () let push = UIPushBehavior . init ( items : [ self . gravity , self . push ], mode : UIPushBehaviorMode . instantaneous ) push . magnitude = 1 //推动的量级必须初始化,量级的大小表示推动的速度 animator . addBehavior ( push ) //控件被推出视图 |
再添加一种碰撞行为
1 2 3 4 | collision = UICollisionBehavior . init ( items : [ self . gravity , self . push ]) collision . translatesReferenceBoundsIntoBoundary = true collision . collisionMode = UICollisionBehaviorMode . everything //这里模式的选择 大家可以不断的调试来检查 尤其是混合效果 比如如果我把推动的模式写为continuous连绵不断的推动,则混合效果中控件就会贴在参照图的边缘不动 animator . addBehavior ( collision ) |

【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具