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. android 对一个合并后的联系人选择编辑,手机屏幕会缓慢变暗后再进入编辑界面的问题

    1.       手机上有一个合并过的联系人 2.       编辑合并后的联系人 3.       手机屏幕会缓慢变暗之后再进入编辑界面. 首先找到contacts源码包下的EditContactA ...

  2. Spring Batch Concepts Chapter

    Spring Batch Concepts Chapter The below figure shows two kinds of Spring Batch components:infrastruc ...

  3. 在Mac OS X 10.9上安装nginx

    1. 安装PCRE Download latest PCRE. After download go to download directory from terminal. $ cd ~/Downlo ...

  4. hadoop数据[Hadoop] 实际应用场景之 - 阿里

    上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助.明天在这里和大家一起学习一下hadoop数据 Hadoop在淘宝和支付宝的应用从09年开始,用于对海量数据的离线处置,例如对日志的分析,也涉及内 ...

  5. XSS攻击:SOHU视频XSS漏洞导致其用户成为DDOS肉鸡

    XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入当中Web里面的html代码会被运行,从而达到恶意攻击用 ...

  6. Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)

    http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零 ...

  7. Python_爬虫1

    Urllib库的基本使用 那么接下来,小伙伴们就一起和我真正迈向我们的爬虫之路吧. 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的 ...

  8. 利用 Composer 完善自己的 PHP 框架(一)——视图装载

    本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顾 经过了上一个 系列教程  <利用 Comp ...

  9. 结合源码看nginx-1.4.0之nginx事件驱动机制详解

    目录 0. 摘要 1. nginx事件模块组织结构 2. nginx事件模块数据结构及类图 3. nginx事件模块运行机制 4. 练习:一个简单的事件驱动模块 5. 小结 6. 参考源码

  10. css笔记12:块元素和行内元素

    1.概念: 行内元素:又叫内联元素,内联元素只能容纳文本或者其他内联元素,常见的内联元素有<span><a> 块元素:块元素一般都是从新行开始,可容纳文本,其他内联元素和其他块 ...