UIDynamic-吸附-重力-碰撞-物理仿真动画
现实生活中:
运动场物理仿真器
跑步物理仿真行为
人==仿真元素
创建步骤:
1.创建物理仿真器,并且指定仿真范围
2.创建物理仿真行为,并且指定仿真元素
3.将物理仿真行为添加到仿真器中
Demo:
#pragma mark -懒加载,创建物理仿真器,并且指定仿真范围
- (UIDynamicAnimator*)dynamicAni
{
if(!_dynamicAni) {
// 1.创建物理仿真器,并且指定仿真范围
_dynamicAni= [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
}
return_dynamicAni;
}
#pragma mark -点击屏幕响应事件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event
{
//获取当前触摸手指,以及位置
//UITouch *touch = [touches anyObject];
//CGPoint point = [touch locationInView:self.view];
//重力
[self gravity];
//碰撞
//[self collision];
//吸附
//[self snapWithPoint:point];
}
#pragma mark -重力
- (void)gravity
{
// 1.创建物理仿真器,并且指定仿真范围
// 2.创建物理仿真行为,并且指定仿真元素
UIGravityBehavior*gravity = [[UIGravityBehavior alloc] initWithItems:@[self.purView]];
//设置重力的方向
//gravity.gravityDirection = CGVectorMake(1, 0);
//gravity.gravityDirection = CGVectorMake(0, -1);
//gravity.gravityDirection = CGVectorMake(1, 1);
//设置重力的角度
//gravity.angle = M_PI_2;
//设置重力的加速度
//gravity.magnitude = 100.0;
// 3.将物理仿真行为添加到仿真器中
[self.dynamicAni addBehavior:gravity];
}
#pragma mark -碰撞,有重力方能碰撞
- (void)collision
{
// 1.创建物理仿真器,并且指定仿真范围
// 2.创建物理仿真行为,并且指定仿真元素
// 2.1创建重力仿真行为
UIGravityBehavior*gravity = [[UIGravityBehavior alloc] initWithItems:@[self.purView]];
gravity.magnitude=3;
// 2.2创建碰撞仿真行为
UICollisionBehavior*collision = [[UICollisionBehavior alloc] initWithItems:@[self.purView,self.redView]];
//碰撞模式
//collision.collisionMode = UICollisionBehaviorModeItems;
//是否设置碰撞的边界,默认边界为物理仿真器边界
//collision.translatesReferenceBoundsIntoBoundary = YES;
//添加直线边界
//[collision addBoundaryWithIdentifier:@"line" fromPoint:CGPointMake(0, 400) toPoint:CGPointMake(320, 500)];
//添加图形的边界,贝赛尔曲线边界
UIBezierPath*path = [UIBezierPath bezierPathWithOvalInRect:self.view.frame];
[collision addBoundaryWithIdentifier:@"rect" forPath:path];
// 3.将物理仿真行为添加到仿真器中
[self.dynamicAni addBehavior:gravity];
[self.dynamicAni addBehavior:collision];
}
#pragma mark -吸附
- (void)snapWithPoint:(CGPoint)point
{
// 1.创建物理仿真器,并且指定仿真范围
// 2.创建物理仿真行为,并且指定仿真元素
UISnapBehavior*snap = [[UISnapBehavior alloc] initWithItem:self.purViewsnapToPoint:point];
//设置吸附行为的"减震", 0.0~1.0
snap.damping=.5;
//注意:使用吸附行为,默认只有一次,如若想要多次必须移除之前的行为再重新添加
[self.dynamicAni removeAllBehaviors];
// 3.将物理仿真行为添加到仿真器中
[self.dynamicAni addBehavior:snap];
}
#pragma mark - QZone
- (void)QZoneAnimation
{
UIButton *addButton = [UIButton buttonWithType:UIButtonTypeContactAdd];
addButton.center=CGPointMake(kScreenW/2,kScreenH-50);
[addButton addTarget:self action:@selector(addButtonAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:addButton];
//初始化弹出的控件
UIView*view1 = [[UIView alloc] initWithFrame:CGRectMake(0,0,20,20)];
view1.backgroundColor= [UIColor greenColor];
view1.center=CGPointMake(kScreenW/2,kScreenH-50);
view1.tag=101;
UIView*view2 = [[UIView alloc] initWithFrame:CGRectMake(0,0,20,20)];
view2.backgroundColor= [UIColor purpleColor];
view2.center=CGPointMake(kScreenW/2,kScreenH-50);
view2.tag=102;
UIView*view3 = [[UIView alloc] initWithFrame:CGRectMake(0,0,20,20)];
view3.backgroundColor= [UIColor cyanColor];
view3.center=CGPointMake(kScreenW/2,kScreenH-50);
view3.tag=103;
[self.view insertSubview:view1 belowSubview:addButton];
[self.view insertSubview:view2 belowSubview:addButton];
[self.view insertSubview:view3 belowSubview:addButton];
}
#pragma mark - addButtonAction
- (void)addButtonAction
{
//吸附
//计算坐标
CGPoint point1 =CGPointMake(kScreenW/2-50,kScreenH-60-50);
CGPoint point2 =CGPointMake(kScreenW/2,kScreenH-60-100);
CGPoint point3 =CGPointMake(kScreenW/2+50,kScreenH-60-50);
CGPoint point =CGPointMake(kScreenW/2,kScreenH-50);
UIView *view1 = (UIView*)[self.view viewWithTag:101];
UIView *view2 = (UIView*)[self.view viewWithTag:102];
UIView *view3 = (UIView*)[self.view viewWithTag:103];
// 2.物理仿真行为
UISnapBehavior*snap1 = [[UISnapBehavior alloc] initWithItem:view1 snapToPoint:point1];
UISnapBehavior*snap2 = [[UISnapBehavior alloc] initWithItem:view2 snapToPoint:point2];
UISnapBehavior*snap3 = [[UISnapBehavior alloc] initWithItem:view3 snapToPoint:point3];
UISnapBehavior*snap4 = [[UISnapBehavior alloc] initWithItem:view1 snapToPoint:point];
UISnapBehavior*snap5 = [[UISnapBehavior alloc] initWithItem:view2 snapToPoint:point];
UISnapBehavior*snap6 = [[UISnapBehavior alloc] initWithItem:view3 snapToPoint:point];
if(_isSnap) {
[self.dynamicAniremoveAllBehaviors];
// 3.将物理仿真行为添加到仿真器中
[self.dynamicAni addBehavior:snap1];
[self.dynamicAni addBehavior:snap2];
[self.dynamicAni addBehavior:snap3];
}else{
[self.dynamicAni removeAllBehaviors];
snap4.damping=.8;
snap5.damping=.8;
snap6.damping=.8;
// 3.将物理仿真行为添加到仿真器中
[self.dynamicAni addBehavior:snap4];
[self.dynamicAni addBehavior:snap5];
[self.dynamicAni addBehavior:snap6];
}
_isSnap= !_isSnap;
}
重力:
碰撞:
吸附:
分散:
UIDynamic-吸附-重力-碰撞-物理仿真动画的更多相关文章
- UIDynamic(物理仿真)
简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如: 重力.弹性碰撞等现象 物理引 ...
- 常见行为:仿真&重力&碰撞&捕捉
一.UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架.可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象,重力.弹性碰撞等,游戏开发中很常见,例如愤怒的小鸟. 二.UI ...
- UIDynamic物理仿真
UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象, 比如重力.弹性碰撞等现象,UIKit动力具有可组合.可重用和声明式 ...
- IOS开发-UIDynamic(物理仿真)简单使用
UIDynamic是从IOS7开始引入的一种新技术,隶属于UIKit框架,我们可以认为是一种物理引擎能模拟和仿真现实生活中的物理现象,比如重力,弹性碰撞等. 可以让开发人员远离物理公式的情况下,实现一 ...
- 【探索之路】机器人篇(5)-Gazebo物理仿真环境搭建_让机器人运动起来
如果完成了前两步,那么其实我们已经可以去连接我们的现实中的机器人了. 但是,做机器人所需要的材料还没有到,所以我们这里先在电脑平台上仿真一下.这里我们用到的就算gazebo物理仿真环境,他能很好的和R ...
- [pixhawk笔记]8-半物理仿真环境
通过半物理仿真,可以在不试飞的情况下对飞控的软硬件进行部分验证,下面结合文档对半物理仿真环境的搭建和运行进行学习.先跑起来再说. Pixhawk支持多轴和固定翼的仿真,多轴用jMavSim,固定翼用X ...
- HTML5重力感应小球冲撞动画实现教程
今天我们来分享一款很酷的HTML5重力感应动画教程,这款动画可以让你甩动页面中的小球,小球的大小都不同,并且鼠标点击空白区域时又可以生成一定数量的小球.当我们甩动小球时,各个小球之间就会发生互相碰撞的 ...
- 上海敏行医学招聘物理仿真,3D图形人才
工作职能: 1.开发医学虚拟手术中的柔体仿真引擎/图形效果 2.柔体仿真引擎.和引擎开发主工程师一起完善和改进仿真引擎的开发工作. 3.3D图形效果的改进. 职位要求: 1.本科以上学历,1年以上c+ ...
- Canvas 数学、物理、动画学习笔记一
Canvas 第五章 数学.物理和运动学习笔记让人映像深刻的运动,需要我们不只是简单的知道如何移动对象,还需要知道怎么按用户期望看到的方式去移动它们.这些需要基于数学知识的基本算法和物理学作用.基于点 ...
随机推荐
- 【Python】安装配置Anaconda
优点:解决Python 库依赖问题 清华安装镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
- 实验一:使用符号执行工具klee对软件进行破解(来自于klee官网)
原文地址:https://gitlab.com/Manouchehri/Matryoshka-Stage-2/blob/master/stage2.md 实验用代码下载地址:https://gitla ...
- 自学git心得-2
趁着最近还没忙起来,抓紧更新一下学习心得. 现在的情景是,我们已经在本地创建了一个Git仓库,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备 ...
- Maximum Subarray解题报告zz
http://fisherlei.blogspot.com/2012/12/leetcode-maximum-subarray.html Find the contiguous subarray wi ...
- 一段SQL代码
begin transaction set quoted_identifier on set arithabort on set numeric_roundabort off set concat_n ...
- Sandworm Attack小结
这个漏洞刚出来时就分析过,当时大致弄明白了原理,但对很多细节和原理还是一知半解.后来开始找工作……今天终于有时间来把欠的这部分功课补上. 这个漏洞网上的各种中英文分析已经很多了,因此这里我只根据自己的 ...
- Linux文件系统检查错误
我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可.但是在进入单用户模式后,我们的/文件系统是只读模式,无法进行修改,那么这个时候我们就需要用到一条命 ...
- ZT 骆家辉宣布辞职 他给中国带来什么留下什么?
骆家辉宣布辞职 他给中国带来什么留下什么? 字号|2013年11月20日 15:20 已有1933人阅读 57 导 读 美国驻华大使骆家辉20日上午发表声明,宣布辞职.骆家辉履任期间为中国 ...
- nefu 628 Garden visiting
//yy:想到昨天一个神题整了几个小时,最后按题解把p拆了用孙子定理..今天这个简单,把C暴力拆了.. 题目链接:nefu 628 Garden visiting 1 <= n, m, p &l ...
- Java虚拟机5:常用JVM命令参数
这里汇总一些平时用到的.看到的一些虚拟机参数: (1)-Xms20M 表示设置堆容量的最小值为20M,必须以M为单位 (2)-Xmx20M 表示设置堆容量的最大值为20M,必须以M为单位.将-Xmx和 ...