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 ...
随机推荐
- android 对一个合并后的联系人选择编辑,手机屏幕会缓慢变暗后再进入编辑界面的问题
1. 手机上有一个合并过的联系人 2. 编辑合并后的联系人 3. 手机屏幕会缓慢变暗之后再进入编辑界面. 首先找到contacts源码包下的EditContactA ...
- Spring Batch Concepts Chapter
Spring Batch Concepts Chapter The below figure shows two kinds of Spring Batch components:infrastruc ...
- 在Mac OS X 10.9上安装nginx
1. 安装PCRE Download latest PCRE. After download go to download directory from terminal. $ cd ~/Downlo ...
- hadoop数据[Hadoop] 实际应用场景之 - 阿里
上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助.明天在这里和大家一起学习一下hadoop数据 Hadoop在淘宝和支付宝的应用从09年开始,用于对海量数据的离线处置,例如对日志的分析,也涉及内 ...
- XSS攻击:SOHU视频XSS漏洞导致其用户成为DDOS肉鸡
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入当中Web里面的html代码会被运行,从而达到恶意攻击用 ...
- Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)
http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零 ...
- Python_爬虫1
Urllib库的基本使用 那么接下来,小伙伴们就一起和我真正迈向我们的爬虫之路吧. 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的 ...
- 利用 Composer 完善自己的 PHP 框架(一)——视图装载
本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顾 经过了上一个 系列教程 <利用 Comp ...
- 结合源码看nginx-1.4.0之nginx事件驱动机制详解
目录 0. 摘要 1. nginx事件模块组织结构 2. nginx事件模块数据结构及类图 3. nginx事件模块运行机制 4. 练习:一个简单的事件驱动模块 5. 小结 6. 参考源码
- css笔记12:块元素和行内元素
1.概念: 行内元素:又叫内联元素,内联元素只能容纳文本或者其他内联元素,常见的内联元素有<span><a> 块元素:块元素一般都是从新行开始,可容纳文本,其他内联元素和其他块 ...