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(,, , )];
view1.center = self.view.center;
view1.backgroundColor = [UIColor redColor]; [self.view addSubview:view1];
view2 =[[UIView alloc]initWithFrame:CGRectMake(,, , )];
view2.center = CGPointMake(self.view.center.x+, self.view.center.y+);
view2.backgroundColor = [UIColor orangeColor];
[self.view addSubview:view2];
view3 =[[UIView alloc]initWithFrame:CGRectMake(,, , )]; 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+, self.view.center.y+);
view3.center = CGPointMake(self.view.center.x+, self.view.center.y+);
view1.hidden = NO;
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// 把之前的动力效果移除
[dynamicAnimator removeAllBehaviors];
//在View1上添加重力效果
UIGravityBehavior * gravity = [[UIGravityBehavior alloc]initWithItems:@[view1]];
// 设置加速度
gravity.magnitude = ;
//设置动力效果的方向
gravity.gravityDirection = CGVectorMake(, );
// 添加到效果器 开始动力效果
[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 = ;
//设置动力效果的方向
gravity.gravityDirection = CGVectorMake(, );
// 添加到效果器 开始动力效果
[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(, , , )];
[collision addBoundaryWithIdentifier:@"yuan" forPath:path]; //把动力效果器的范围当做边界
collision.translatesReferenceBoundsIntoBoundary = YES;
[dynamicAnimator addBehavior:collision];
}

IOS-UI-UIDynamic(一)的更多相关文章

  1. [IOS]IOS UI指南

    [IOS]IOS UI指南 众所周知,IOS的界面设计,越来越流行,可以说都形成了一个标准,搜集了一些资料,供自己以后学习使用! iOS Human Interface Guidelines (中文翻 ...

  2. IOS UI 第八篇:基本UI

    实现图片的滚动,并且自动停止在每张图片上     - (void)viewDidLoad{    [super viewDidLoad]; UIScrollView *scrollView = [[U ...

  3. 国外IOS UI指南

    国外IOS UI指南 众所周知,IOS的界面设计,越来越流行,可以说都形成了一个标准,搜集了一些资料,供自己以后学习使用! iOS Human Interface Guidelines (中文翻译) ...

  4. iOS UI的几种模式

    iOS UI的几种模式: 1.平凡模式(原生控件组合): 2.新闻模式: 3.播放器模式: 4.微博模式:

  5. 通过实现一个TableView来理解iOS UI编程

    推荐一篇神作: 通过实现一个TableView来理解iOS UI编程 http://blog.jobbole.com/61101/

  6. iOS基础 - UIDynamic

    一.UIKit动力学 UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞,悬挂等效果,即将2D物理引擎引入了UIKit 注意:UIKit动力学的引入,并不是 ...

  7. AJ学IOS 之UIDynamic重力、弹性碰撞吸附等现象

    AJ分享,必须精品 一:效果 重力和碰撞 吸附现象 二:简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真 ...

  8. [iOS UI设计笔记整理汇总]

    8.UIsearchbar放到Navigationbar 上(意思是建个View作为titleview) //此处调用的是第三方封装的SearchBar,也可以自定义. self.searchBarW ...

  9. iOS UI高级之网络编程(HTTP协议)

    HTTP协议的概念 HTTP协议,Hyper Text Transfer Protocol (超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响 ...

  10. iOS - UI - UIWebView

    1.UIWebView UIWebView 是 苹果提供的用来展示网页的UI控件.它也是最占内存的控件. iOS8.0 webkit框架. WKWebView,相比UIWebView,节省了1/3~1 ...

随机推荐

  1. const 成员方法

    1.使用场景 代码提供者告诉客户(代码使用者),这个方法不会修改对象的内容,请客户放心使用. 2.代码提供者,尝试在const成员方法中修改对象内容,编译报错.在成员方法中,this是const 指针 ...

  2. Codeforces Round #326 (Div. 2) B. Duff in Love 分解质因数

    B. Duff in Love Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/588/proble ...

  3. HDU 4343 D - Interval query 二分贪心

    D - Interval queryTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest ...

  4. POJ 1743 Musical Theme 后缀数组 最长重复不相交子串

    Musical ThemeTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=1743 Description ...

  5. 最简单的视频编码器:编译(libx264,libx265,libvpx)

    ===================================================== 最简单的视频编码器系列文章列表: 最简单的视频编码器:编译 最简单的视频编码器:基于libx ...

  6. Spark wordcount 编译错误 -- reduceByKey is not a member of RDD

    Attempting to run http://spark.apache.org/docs/latest/quick-start.html#a-standalone-app-in-scala fro ...

  7. MHA手动切换 原创2 (主参与复制)

    monitor 执行下面命令后, --orig_master_is_new_slave :原主变为新从,即server1变成了slave1的从.slave2跟据app1.conf中配制也变成了slav ...

  8. Date Format, 时间戳格式化

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...

  9. 【ZZ】大数据架构师基础:hadoop家族,Cloudera系列产品介绍

    http://www.36dsj.com/archives/17192 大数据我们都知道hadoop,可是还会各种各样的技术进入我们的视野:Spark,Storm,impala,让我们都反映不过来.为 ...

  10. SQL Server中内连接和外连接的区别

    SQL Server中内连接和外连接的区别 假设一个数据库中有两张表,一张是学生表StudentInfo,一张是班级表ClassInfo,两张表之间用ClassId字段进行关联. 如果用内连接,正常的 ...