UIDynamic是从iOS7开始引入的技术 属于UIkit框架 可以模拟显示生活中的物理现象 如碰撞 抖动 摆动等

一.使用UIDynamic步骤:

1.创建一个动力效果器UIDynamicAnimator

2.创建动力效果(Behavior)添加到对于的视图上

3.将动力效果添加到动力效果器中

注:必须遵守了UIDynamicItem这个协议才可以使用动力效果,UIView默认已经遵守了UIDynamicItem协议

玩动力效果  如玩电吉他   电吉他有效果器  可以添加各种电子效果

动力效果  也有一个效果器 叫做 动力效果器  里面可以添加 动力效果

电吉他切换效果  会把上一个效果移除

动力效果 也是一样

电吉他可以叠加多个效果

动力效果 也是一样

UIDynamic提供的动力效果

二.重力效果的属性:

UIGravityBehavior:重力效果(设置重力的方向 加速度 让物体(视图)朝着重力方向掉落)

NSArray *items;添加到重力效果中的所有效果作用对象

CGVector gravityDirection;重力方向(是一个二维向量)以左上角为坐标原点 x 负数向左 正数向右  y 负数向上  正数向下  数字越大  重力效果越大

CGFloat angle;重力方向(是一个角度,x轴正方向为0°,顺时针正数,逆时针负数)

CGFloat magnitude;量级(用来控制加速度,1.0代表加速度是1000 points /second²)重力加速度越大 碰撞越厉害

UICollisionBehavior:碰撞效果()可以让物体之间实现碰撞效果, 也可以通过添加边界(boundary)在边界实现碰撞效果

边界相关的方法:

- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier forPath:(UIBezierPath*)bezierPath; 添加一个贝塞尔曲线路径的边界

- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier fromPoint:(CGPoint)p1 toPoint:(CGPoint)p2; 通过添加两个点连成的线 作为边界

- (UIBezierPath*)boundaryWithIdentifier:(id <NSCopying>)identifier; 通过ID找到边界路径

- (void)removeBoundaryWithIdentifier:(id <NSCopying>)identifier; 移除ID对应的边界

@property (nonatomic, readonly, copy) NSArray* boundaryIdentifiers; 边界数组

- (void)removeAllBoundaries;移除所有边界

typedef NS_OPTIONS(NSUInteger, UICollisionBehaviorMode) {

UICollisionBehaviorModeItems        = 1 << 0,元素碰撞

UICollisionBehaviorModeBoundaries   = 1 << 1,边界碰撞

UICollisionBehaviorModeEverything   = NSUIntegerMax 全体碰撞

} NS_ENUM_AVAILABLE_IOS(7_0);

碰撞效果的代理方法:

//两个元素相互碰撞

- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2 atPoint:(CGPoint)p;

- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2;

// 视图碰撞边界的时候 触发

- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier atPoint:(CGPoint)p;

- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier;

三.具体代码

 
@interface ViewController ()<UIDynamicAnimatorDelegate,UICollisionBehaviorDelegate>
{
UIDynamicAnimator * dynamicAnimator;
UIView * view1;
UIView * view2;
UIView * view3;
} @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad];
// 动力效果器
dynamicAnimator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
// self.view 产生动力效果的区域
dynamicAnimator.delegate = self;
view1 =[[UIView alloc]initWithFrame:CGRectMake(0,0,90 , 90)];
view1.center = self.view.center;
view1.backgroundColor = [UIColor redColor]; [self.view addSubview:view1];
view2 =[[UIView alloc]initWithFrame:CGRectMake(0,0,90 , 90)];
view2.center = CGPointMake(self.view.center.x+100, self.view.center.y+100);
view2.backgroundColor = [UIColor orangeColor];
[self.view addSubview:view2];
view3 =[[UIView alloc]initWithFrame:CGRectMake(0,0,90 , 90)]; view3.backgroundColor = [UIColor blueColor];
[self.view addSubview:view3]; }
 
 
#pragma mark -------手指触摸屏幕 添加动力效果--------------------------
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch * touch = [touches anyObject];
CGPoint touchpoint = [touch locationInView:self.view];
view1.center = touchpoint;
view2.center = CGPointMake(self.view.center.x+100, self.view.center.y+100);
view3.center = CGPointMake(self.view.center.x+10, self.view.center.y+10);
view1.hidden = NO;
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// 把之前的动力效果移除
[dynamicAnimator removeAllBehaviors];
//在View1上添加重力效果
UIGravityBehavior * gravity = [[UIGravityBehavior alloc]initWithItems:@[view1]];
// 设置加速度
gravity.magnitude = 100;
//设置动力效果的方向
gravity.gravityDirection = CGVectorMake(0, 1);
// 添加到效果器 开始动力效果
[dynamicAnimator addBehavior:gravity];
UICollisionBehavior * collision = [[UICollisionBehavior alloc]initWithItems:@[view1,view2,view3]];
collision.collisionDelegate = self;
collision.translatesReferenceBoundsIntoBoundary = YES;
// 如果设置了 两个元素之间相互碰撞 设置了边界 也就不起作用了
// collision.collisionMode = UICollisionBehaviorModeItems;
[dynamicAnimator addBehavior:collision];
#pragma mark----------------动力元素效果----------------------------
//可以与其他的 动力效果 配合使用
UIDynamicItemBehavior * item = [[UIDynamicItemBehavior alloc]initWithItems:@[view2,view1,view3]];
// 设置元素的跳跃度
item.elasticity = 0.9;
[dynamicAnimator addBehavior:item]; }
 

当然还可以设置边界,当只添加View1时

 
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// 把之前的动力效果移除
[dynamicAnimator removeAllBehaviors];
//在View1上添加重力效果
UIGravityBehavior * gravity = [[UIGravityBehavior alloc]initWithItems:@[view1]];
// 设置加速度
gravity.magnitude = 100;
//设置动力效果的方向
gravity.gravityDirection = CGVectorMake(0, 1);
// 添加到效果器 开始动力效果
[dynamicAnimator addBehavior:gravity];
#pragma mark ------碰撞效果-----------------------
UICollisionBehavior * collision = [[UICollisionBehavior alloc]initWithItems:@[view1,view2]];
collision.collisionDelegate = self;
// 设置一条下斜线边界
// [collision addBoundaryWithIdentifier:@"line1" fromPoint:CGPointMake(0, 300) toPoint:CGPointMake(400, 600)];
//设置竖直线边界
// [collision addBoundaryWithIdentifier:@"line2" fromPoint:CGPointMake(300, 0) toPoint:CGPointMake(300, 600)];
// 通过贝瑟尔曲线 画一个圆
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 200, 300, 300)];
[collision addBoundaryWithIdentifier:@"yuan" forPath:path]; //把动力效果器的范围当做边界
collision.translatesReferenceBoundsIntoBoundary = YES;
[dynamicAnimator addBehavior:collision];
}
 

UIDynamic动画的更多相关文章

  1. UIDynamic(简单介绍)

    一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如:重力.弹性碰撞等现 ...

  2. iOS开发——高级篇——UIDynamic 物理引擎

    一.UIDynamic 1.简介什么是UIDynamicUIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象重力.弹性碰撞 ...

  3. UIDynamic(物理仿真)

    简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如: 重力.弹性碰撞等现象 物理引 ...

  4. iOS开发拓展篇—UIDynamic(简单介绍)

    iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟 ...

  5. UIDynamic仿物理引擎-浮动碰撞效果-b

    最近产品提了个需求(电商的APP-两鲜),需要在APP背景加上几个水果图案在那里无规则缓慢游荡...模仿 天天果园 APP的.好吧,那我就在网上找了很多文章,总结一下写个demo.效果如下: Mou ...

  6. 自定义UICollectionViewLayout并添加UIDynamic - scorpiozj(转)

    转载自:http://www.tuicool.com/articles/jM77Vf     自定义UICollectionViewLayout并添加UIDynamic UICollectionVie ...

  7. 李洪强iOS开发之拓展篇—UIDynamic(简单介绍)

      iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能 ...

  8. UIDynamic(一)

    UIDynamic(一) 前言 最近看了一下UIDynamic,UIDynamic是13年WWDC出的技术.其实本人一直热衷于比较有趣的动画,特别是带物理力学的动画,感觉物理力学就是动画的灵魂,一直想 ...

  9. iOS开发——UI篇OC篇&UIDynamic详解

    iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟 ...

随机推荐

  1. java中堆和栈的区别

    从宏观上来讲,栈内存:存储基本数据类型.堆内存:存储实际的对象内容.说明白点就是new出来的东西. int a = 3; int b = 3; a = 4; 编译器首先会处理int a = 3;将a进 ...

  2. php数据结构与算法

    php面试题之二--数据结构和算法(高级部分) 二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator ...

  3. mongodb university week4

    1.index Creation,background 如果在foreground运行index,会阻塞其他writer,如果background运行,会比较慢,但不会阻塞其他writer,可以并发写 ...

  4. Js控制iFrame切换加载网址

    <html> <head> <title>Js控制 iFrame 切换加载网址</title> </head> <body> & ...

  5. SSH-Struts第二弹:一个Form提交两个Action

    根据CSDN中的博客:http://blog.csdn.net/forwayfarer/article/details/3030259进行学习. 1.多个submit的Form表单页面 or 在jsp ...

  6. 跟着百度学PHP[4]OOP面对对象编程-17-多态

    多态是除封装和继承之外的另一个面象对象的三大特性之一. 多态的作用简而言之就是为程序做括展. 比如说在公司上班,每个月财务发放工资,同一个发工资的方法,在公司内不同的员工或是不同职位的员工,都是通过这 ...

  7. 标签语义化之常用HTML标签

    一.布局的理解误区 网络上流行管新型的布局方式叫“DIV+CSS”,其实是一个错误的理解,导致了很多人过度依赖与滥用DIV标签, HTML提供了我们一共七八十个标签,其中常用的有三十个左右,DIV不过 ...

  8. qt-5.6.0 移植之tslib 配置及编译

    tslib 是qt启动时的一个触屏校正检验程序. 它的配置以及编译比较简单. 第一步, 下载tslib源码包: http://download.csdn.net/detail/MKNDG/329156 ...

  9. exit()和_exit()

    进程就好比人一样有其生命,我们通过fork()函数来创建一个进程,那么我们又是如何来中止进程呢. 进程退出 1.在Linux中任何让一个进程退出 进程退出表示进程即将结束.在Linux中进程退出分为了 ...

  10. java78_c

    import java.util.*; public class Main { public static void main(String args[]){ Scanner cin=new Scan ...