iOS UIDynamicAnimator 详解

简介: iOS UIDynamicAnimator 详解

UIDynamicAnimator 学习总结


什么是UIKit动力?—— 一句话:UIKit动力提供了一个模拟真实世界中力学相关的动画和交互系统。比如重力、碰撞和吸附等。UIKit动力具有可组合、可重用和声明式的特点。


1.吸附行为(UIAttachmentBehavior):有一个对象UIAttachmentBehavior,该对象用来指定两个动力项(项或点)之间的连接,当一个项或者点移动时,吸附的项也随之移动。当然,这个连接并不是完全是静态的(static),吸附的项有两个属性damping(阻尼)和oscillation(震荡),这两个属性决定了吸附项的行为是如何随时间而变化的。


2.碰撞行为(UICollisionBehavior):通过对象UICollisionBehavior指定一个边界,并且让各个动力项,在该边界内参与碰撞。UICollisionBehavior对象还可以指定这些动力项适当的回应碰撞。


3.重力行为(UIGravityBehavior):通过对象UIGravityBehavior给动力项指定一个重力矢量,具有重力矢量的动力项,会在重力矢量的方向上一直加速,直到与别的动力项产生了冲突或者,遇到了边界。


4.推动行为(UIPushBehavior):通过对象UIPushBehavior给动力项指定一个持续的或者瞬时的力(force vector)。


5.捕捉行为(UISnapBehavior):通过对象UISnapBehavior给动力项指定一个捕捉点。动力项会根据配置的效果,来抓住这一捕捉点。


当动力行为被添加到animator(UIDynamicAnimator类的实例对象)时,动力行为就被激活。animator为动力行为的执行提供了上下文。动力项可以有多个行为,只不过所有这些行为都必须添加到相同的animator中。


UIKit动力架构:


一、UIDynamicAnimator介于iOS图形引擎和动力项(View)之间,具有如下功效:


```


• 提供动力行为的上下文


• 根据ref view确定坐标系


• 控制动力引擎


• 维护着动力行为的状态


实例化UIDynamicAnimator的三种方法:


• 在views上使用动力动画,使用- (instancetype)initWithReferenceView:(UIView *)view方法(instancetype在iOS7中代替id)。reference view的坐标系作为动力行为和动力项的坐标系。动力项必须为UIView,必须源自于reference view。


• 在collection views上使用动力动画,使用- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout方法。collection view layout的坐标系作为动力行为和动力项的坐标系。动力项必须为UICollectionViewLayoutAttributes对象。可使用setTranslatesReferenceBoundsIntoBoundaryWithInsets:设置碰撞动力界限(相对于collection view layout的坐标系),当collection view layout发生改变时,会自动调用invalidateLayout、暂停、重新开始动力。


• 在遵循UIDynamicItem协议的对象使用动力动画,通过init方法创建。动画使用绝对坐标系(估计是受窗口约束)。没有 什么时候创建碰撞界限 的参考,然而可以在描述UICollisionBehavior实例的时候指定自定义碰撞界限。 ```


``` UIDynamicAnimator通性:


• 每个DynamicAnimator独立于其他的DynamicAnimator。


• 可以通过向相同的DynamicAnimator提交多个UIDynamicBehavior,将行为绑定到动力项。


• 所有dynamic item休息的时候DynamicAnimator会暂停,UIDynamicBehavior或者dynamic item增加删除会重启DynamicAnimator。 ```


``` UIDynamicAnimator管理:


• – itemsInRect:返回贯穿指定区域的所有dynamic item。


• – addBehavior:向UIDynamicAnimator中添加UIDynamicBehavior。


• – removeBehavior:撤销指定UIDynamicBehavior。


• – removeAllBehaviors撤销所有UIDynamicBehavior。 ```


``` UIDynamicAnimator状态访问:


• – elapsedTime 返回动画开始到现在的时间间隔。


• running property (read-only) 如果UIDynamicAnimator正在运行,返回YES


• behaviors property (read-only) 返回UIDynamicAnimator管理的UIDynamicBehavior


• referenceView property (read-only) 返回用来实例化UIDynamicAnimator的UIView


• delegate property 响应UIDynamicAnimator暂停或重启的代理


• – updateItemFromCurrentState: (更新dynamic item在UIDynamicAnimator内部的代表的状态),dynamic item被加入到UIDynamicAnimator后,你更改了dynamic item的状态,你应该使用这个方法更新dynamic item的状态。


UIDynamicAnimator中的Collection View Additions:


• - (UICollectionViewLayoutAttributes *)layoutAttributesForCellAtIndexPath:(NSIndexPath *)indexPath 返回指定位置collection view cell的布局属性


• - (UICollectionViewLayoutAttributes *)layoutAttributesForDecorationViewOfKind:(NSString *)decorationViewKind atIndexPath:(NSIndexPath *)indexPath 返回indexPath位置上collection view cell的指定(用decorationViewKind指定)decorationView的布局属性。


• - (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 返回indexPath位置上collection view cell的指定(用kind指定)SupplementaryView的布局属性。 ```


二、UIDynamicAnimatorDelegate是与UIDynamicAnimator相关的一个delegate


UIDynamicAnimator停止或将要启动的时候分别会调用UIDynamicAnimatorDelegate中的dynamicAnimatorDidPause:或dynamicAnimatorWillResume:方法。


三、UIDynamicBehavior:二维动画中,主要用来描述动力的行为。在iOS7中,默认提供了如下动力行为:


``` • UIAttachmentBehavior


• UICollisionBehavior


• UIDynamicItemBehavior


• UIGravityBehavior


• UIPushBehavior


• UISnapBehavior objects ```


动力行为可以在任意时间内进行添加或移除。另外动力行为可以是组合的,也可以被继承。可以通过向UIDynamicBehavior或者用户子类化的UIDynamicBehavior的实例使用addChildBehavior: 方法创建组合行为。(但不能向系统提供的行为使用该方法)


``` UIDynamicBehavior配置:


• action property在UIDynamicAnimator运行过程中每一步都会调用的语句块


• – addChildBehavior:向自定义的UIDynamicBehavior添加子行为


• childBehaviors property (read-only) 返回自定义UIDynamicBehavior的子行为数组


• – removeChildBehavior:删除自定义的UIDynamicBehavior的子行为 ```


``` UIAttachmentBehavior


指定两个动力项或者动力项和锚点间的连接。动力项默认锚点在他的center。步骤1.使用initWithItem:方法实例化UIAttachmentBehavior 2.使用addBehavior: 方法将行为添加到动力动画。


可以加入到自定义的组合行为,如果想在动力动画的每一步改变行为,可以实现继承的 action 方法。 ```


``` UIAttachmentBehavior实例化方法及管理:


• items property(read-only)返回行为连接的dynamic items。


• – initWithItem:attachedToAnchor:实例化UIAttachmentBehavior,连接dynamic item的center到一个锚点。


• – initWithItem:attachedToItem:实例化UIAttachmentBehavior,连接dynamic item的center到另一个dynamic item的center。


• – initWithItem:point:attachedToAnchor:实例化UIAttachmentBehavior,连接dynamic item的指定点(相对于dynamic item center的点)到一个锚点。


• – initWithItem:point:attachedToItem:point:实例化UIAttachmentBehavior,连接dynamic item的指定点(相对于dynamic item center的点)到另一个dynamic item的指定点。 ```


``` UIAttachmentBehavior配置:


• anchorPoint property 锚点类型UIAttachmentBehavior的锚点。


• attachedBehaviorType property (read-only) UIAttachmentBehavior的类型,枚举(UIAttachmentBehaviorTypeItems,UIAttachmentBehaviorTypeAnchor)


• damping property 阻尼数值(浮点)


• frequency property 震动频率(浮点)


• length property 两个吸附点间的距离(浮点) ```


``` UICollisionBehavior


指定一些dynamic item可以相互碰撞或者与UICollisionBehavior的界线碰撞。步骤1.使用init方法创建UICollisionBehavior,使用addItem: 方法向其添加dynamic item 或者使用initWithItems:实例化UICollisionBehavior。2. 使用addBehavior: 方法将UICollisionBehavior加入到动力动画 ```


``` UICollisionBehavior实例化方法及管理:


– addItem: 向UICollisionBehavior实例添加dynamic item


– initWithItems: 使用dynamic item数组实例化UICollisionBehavior


– removeItem: 删除dynamic item


items property (read-only) 返回UICollisionBehavior实例中的dynamic item数组 ```


``` UICollisionBehavior配置:


UICollisionBehavior设置界线的三种方法:


• addBoundaryWithIdentifier:forPath:


• addBoundaryWithIdentifier:fromPoint:toPoint:


• setTranslatesReferenceBoundsIntoBoundaryWithInsets: (前提使用reference view 或者 collection view layout实例化的动力动画)


注意: dynamic item的初始位置不能在界线外


boundaryIdentifiers property(read-only) 返回UICollisionBehavior 实例的所有界线标示符


– boundaryWithIdentifier: 返回指定标示符对应的贝塞尔曲线界线


collisionDelegate property UICollisionBehavior 实例的collisionDelegate会响应 碰撞的一些回调方法。查阅UICollisionBehaviorDelegate


collisionMode property 指定碰撞类型 UICollisionBehaviorModeItems = 1 << 0,


UICollisionBehaviorModeBoundaries = 1 << 1,


UICollisionBehaviorModeEverything = NSUIntegerMax


– removeAllBoundaries


– removeBoundaryWithIdentifier:


translatesReferenceBoundsIntoBoundary property 基于相对坐标系统的界线是否有效


UIDynamicItemBehavior


基本的动力动画描述,每一个属性重写了对应的默认值。


步骤1.使用init方法创建UICollisionBehavior,使用addItem: 方法向其添加dynamic item 或者使用initWithItems:实例化UIDynamicItemBehavior。2. 使用addBehavior: 方法将UIDynamicItemBehavior加入到动力动画


使用allowsRotation 属性设置行为中的dynamic item是否可以循环。


使用elasticity 属性设置碰撞弹性系数。范围(0.0-1.0)


使用friction 属性设置摩擦系数。


使用resistance property设置线性阻力系数。(0--CGFLOAT_MAX)


使用angularResistance property设置角度阻力系数。(0--CGFLOAT_MAX)


使用density property设置相对密度。不明白什么意思


注意: 如果向同一个动力动画添加多个UIDynamicItemBehavior实例,只会应用一套属性描述(交集?)多个UIDynamicItemBehavior实例配置同个属性时,使用最后的。


– addAngularVelocity:forItem:向dynamic item增加角速度属性。单位弧度


– addLinearVelocity:forItem: 向dynamic item增加线速度属性。单位点


angularResistance property UIDynamicItemBehavior的角度阻力系数。 ```


``` UIPushBehavior


UISnapBehavior


这两个自学吧实在不想写了。 ```


四、Reference View:该用是用来初始化Animator用的,它的作用是给动力行为提供坐标系。


五、View:在UIKit动力中,又称为动力项(dynamic item)。动力项是遵循UIDynamicItem协议的任意对象(可以是SDK中默认提供的,或者开发者自定义的)。(The UIView and UICollectionViewLayoutAttributes classes implement this protocol starting in iOS 7.0.)


相关文章
|
iOS开发
iOS presentedViewController和presentingViewController
iOS presentedViewController和presentingViewController
82 0
|
iOS开发 Windows
iOS使用SceneDelegate
xcode11创建项目新增SceneDelegate文件,AppDelegate文件结构也发生变化,在AppDelegate.h文件中没有了window属性,而是在SceneDelegate.h中,可见AppDelegate不管理window而是交给SceneDelegate。由于这些是ios13新增,所以SceneDelegate在ios13以下的系统是不支持。
555 0
iOS使用SceneDelegate
|
API iOS开发 UED
iOS右滑返回的实现(interactivePopGestureRecognizer)
iOS右滑返回的实现(interactivePopGestureRecognizer)
1037 0
iOS右滑返回的实现(interactivePopGestureRecognizer)
iOS NSInvocation应用与理解
iOS NSInvocation应用与理解
165 0
|
iOS开发 数据格式
你不得不知道的iOS 中的 Copying
Copying 在 iOS 中有很多概念,例如浅拷贝与深拷贝、copy 与 mutableCopy、NSCopying 协议,一直想彻底搞明白这些概念,刨根问底不搞懂不罢休嘛。于是搜 Google 看了一些博客,又去翻了 Apple 相关的文档,发现网上许多博客都理解错了,下面说说自己的理解。
4345 0
|
Android开发 iOS开发 开发者
|
iOS开发
iOS - C 应用
前言 1)操作符两端必须加空格,(每行第一个赋值语句对齐)。 2)变量名必须是英文(不能是拼音):英文、数字、下划线和美元符号。 3)等于号 == 反过来写(0 == i%4)防止少些赋值号的错误。 4)通常不省略分支括号。
826 0