IOS-UI-UIDynamic(一)
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(一)的更多相关文章
- [IOS]IOS UI指南
[IOS]IOS UI指南 众所周知,IOS的界面设计,越来越流行,可以说都形成了一个标准,搜集了一些资料,供自己以后学习使用! iOS Human Interface Guidelines (中文翻 ...
- IOS UI 第八篇:基本UI
实现图片的滚动,并且自动停止在每张图片上 - (void)viewDidLoad{ [super viewDidLoad]; UIScrollView *scrollView = [[U ...
- 国外IOS UI指南
国外IOS UI指南 众所周知,IOS的界面设计,越来越流行,可以说都形成了一个标准,搜集了一些资料,供自己以后学习使用! iOS Human Interface Guidelines (中文翻译) ...
- iOS UI的几种模式
iOS UI的几种模式: 1.平凡模式(原生控件组合): 2.新闻模式: 3.播放器模式: 4.微博模式:
- 通过实现一个TableView来理解iOS UI编程
推荐一篇神作: 通过实现一个TableView来理解iOS UI编程 http://blog.jobbole.com/61101/
- iOS基础 - UIDynamic
一.UIKit动力学 UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞,悬挂等效果,即将2D物理引擎引入了UIKit 注意:UIKit动力学的引入,并不是 ...
- AJ学IOS 之UIDynamic重力、弹性碰撞吸附等现象
AJ分享,必须精品 一:效果 重力和碰撞 吸附现象 二:简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真 ...
- [iOS UI设计笔记整理汇总]
8.UIsearchbar放到Navigationbar 上(意思是建个View作为titleview) //此处调用的是第三方封装的SearchBar,也可以自定义. self.searchBarW ...
- iOS UI高级之网络编程(HTTP协议)
HTTP协议的概念 HTTP协议,Hyper Text Transfer Protocol (超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响 ...
- iOS - UI - UIWebView
1.UIWebView UIWebView 是 苹果提供的用来展示网页的UI控件.它也是最占内存的控件. iOS8.0 webkit框架. WKWebView,相比UIWebView,节省了1/3~1 ...
随机推荐
- Debug with jdb
原文地址: http://www.javaworld.com/article/2077445/testing-debugging/debug-with-jdb.html Q: How do you u ...
- Spring声明式事务的配置~~~
/*2011年8月28日 10:03:30 by Rush */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加 ...
- HDU 1863 畅通工程
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- UVA 1557 - Calendar Game(博弈dp)
UVA 1557 - Calendar Game 题目链接 题意:给定一个日期,两个人轮流走,每次能够走一月或者一天,问最后谁能走到2001.11.4这个日子 思路:记忆化搜索,对于每一个日期,假设下 ...
- 将PHP作为Shell脚本语言使用
我们都知道.PHP是一种非常好的动态网页开发语言(速度飞快.开发周期短--).可是仅仅有非常少数的人意识到PHP也能够非常好的作为编写Shell脚本的语言,当PHP作为编写Shell脚本的语言时,他并 ...
- 【VBA研究】怎样将单元格数据赋给数组
作者:iamlaosong 将工作表中的数据赋给数组或者将数组的数据赋给工作表,一般有两种.一种是循环的方法,一个一个的传,这样的方法一般用于须要对每一个数据特别处理的场合,还有一种是一次性用赋值语句 ...
- NSRange,判断字符串的各种操作~
今天写的都比较简单,偶尔偷一下懒,猪真的很懒啊~ - (void)viewDidLoad { [super viewDidLoad]; //抽取指定范围的字符串 NSString *string1 ...
- MySQL ddl丢表
MySQL ddl丢表: MySQL server层为了和innodb层保持数据一致性,在写binlog和redo log时,引入了两阶段提交,但不同的变更产生的日志并非都使用这种策略. 下面就来 ...
- MHA手动在线切换主 原创3(主不参与复制)
monitor 执行:slave2连接到slave1,server1 不做(主/从复制角色,停在那里) [root@monitor app1]# masterha_master_switch --co ...
- apache 配置order allow deny讲解
http://www.111cn.net/phper/apache/43025.htm