UIDynamic概述:
1、UIDynamic - UIKit动力学:在最需要引入逼真的交互设计时,使用UIKit动力学可以作为实现交互设计和现实的一种补充。
2、特点:将现实世界动力驱动的动画引入到UIKit;比如重力行为、碰撞行为、吸附行为、悬挂行为等。
3、UIDynamic三要素
3.1 UIDynamic Animator:动力学元素提供物理学相关的能力及动画,同时为这些元素提供相关的上下文,是动力学元素与底层iOS物理引擎之间的中介。将Behavior对象添加到Animator中即可实现动力学仿真。
3.2 UIDynamic Animator Item:动力学元素,是任何遵守UIDynamicItem协议的对象。iOS7.0开始,UIView和UICollectionViewLayoutAttributes默认实现该协议。
3.3 UIDynamicBehavior :动力学行为的父类。基本的动力学行为:UIGravityBehavior、UICollisionBehavior、UIAttachmentBehavior、UISnapBehavior、UIPushBehavior以及UIDynamicItemBehavior。均继承自UIDynamicBehavior类。
4、三个概念
(1)谁要进行物理仿真?
物理仿真元素(Dynamic Item)
(2)执行怎样的物理仿真效果?怎样的动画效果?
物理仿真行为(Dynamic Behavior)
(3)让物理仿真元素执行具体的物理仿真行为
物理仿真器(Dynamic Animator)
重力行为
1、初始化仿真模拟器
//self.view是一个参照视图,表示物理仿真的范围
UIDynamicAnimator *_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
2、初始化物理仿真元素
_item = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 50, 50)];
_item.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"box.png"]];
[self.view addSubview:_item];
3、初始化重力行为
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[_item, _item1]];
//一定要将创建的行为添加到仿真模拟器中。
[_animator addBehavior:gravity];
碰撞行为
1、初始化仿真模拟器(同上)
2、初始化物理仿真元素(同上)
3、初始化碰撞行为
UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[_item1]];
//指定是否启用参照系的边界
collision.translatesReferenceBoundsIntoBoundary = YES;
[_animator addBehavior:collision];
连接行为
1、初始化仿真模拟器(同上)
2、初始化物理仿真元素(同上)
3、初始化连接行为
3.1 初始化锚点坐标(设置锚点坐标随着触碰点移动)
CGPoint anchor = [touch locationInView:self.view];
3.2 创建连接行为
UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:_item attachedToAnchor:anchor];
3.3 设置连接的属性
attachment.length = 0; //设置连接点的长度
attachment.damping = .5; //设置衰减
attachment.frequency = 5; //设置震动频率
3.4 将创建的连接行为添加到仿真模拟器中
[_animator addBehavior:attachment];
附着行为
- 视图与锚点或者视图之间相连接而产生的动作行为;
- 两点之间连接状况,可模拟刚性或者弹性连接
- 可以实现多个物体的连接
1、初始化仿真模拟器(同上)
2、初始化物理仿真元素(同上)
3、初始化附着行为
3.1 设置锚点
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self.view];
3.2 初始化附着行为
_snap = [[UISnapBehavior alloc] initWithItem:_item snapToPoint:point];
3.3 设置属性
_snap.damping = .5;
3.4 将附着行为添加到仿真模拟器
[_animator addBehavior:_snap];
附着行为是属性
1、attachedBehaviorType:连接类型
2、items:连接视图数组
3、anchorPoint:连接锚点
4、length:距离连接锚点的距离
连接一下两种属性即可弹性连接
1、damping:振幅衰减
2、frequency:振幅频率
push(推)行为
- 推行为:视图+作用力;作用力可以为持续力,也可以为一次性力
- 作用力的大小、方向、作用点均可以设置
- 属性:1、mode:推动类型 2、active:是否为激活状态(一次性推动需要激活) 3、angle:推动角度 4、magnitude:推动力量
1、初始化仿真模拟器(同上)
2、初始化物理仿真元素(同上)
3、初始化一个push行为
3.1 创建push行为
UIPushBehavior *push = [[UIPushBehavior alloc] initWithItems:@[_item1] mode:UIPushBehaviorModeInstantaneous];
3.2 若只是push一次的话需要设置它的激活状态(多次时不用)
push.active = YES;
3.3 设置push的力度,由于是2D的,所以用触摸点滑动的距离来模拟物理力度
CGFloat distance = sqrtf((powf(_endPoint.x - _beganPoint.x, 2) +powf(_endPoint.y - _beganPoint.y, 2)));
push.magnitude = distance/100;
3.4 将创建的push对象添加到仿真模拟器中
[_animator addBehavior:push];
UIDynamicItemBehavior 动力学元素行为
- 动力学元素行为:辅助行为
- 用来设置运动参与物理仿真过程的参数,如:弹性系数、摩擦系数、密度、阻力、角阻力以及是否允许旋转等;
- 属性
- elasticity:弹性系数,决定碰撞弹性程度;
- friction:摩擦系数,决定滑动时摩擦力的大小;
- density:密度,与size结合使用,计算物体总的重量;
- resistance:阻力,决定线性移动的阻力大小(区分摩擦系数)
- angularResistance:角阻力,决定旋转运动阻力的大小
- allowsRotation:还否允许旋转;
1、创建动力学元素行为
UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[_item,_item1]];
2、设置属性
itemBehavior.resistance = 1;//阻尼系数
3、注意:所有的物理仿真行为 都需要加入到物理仿真模拟器中才能完成
[_animator addBehavior:itemBehavior];
UIDynamic简单总结
原文:http://www.cnblogs.com/factor/p/5064951.html