iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)

一、重力行为

说明:给定重力方向、加速度,让物体朝着重力方向掉落

1.方法

(1)UIGravityBehavior的初始化

  - (instancetype)initWithItems:(NSArray *)items;

    item参数 :里面存放着物理仿真元素

(2)UIGravityBehavior常见方法

  - (void)addItem:(id <UIDynamicItem>)item;

    添加1个物理仿真元素

  - (void)removeItem:(id <UIDynamicItem>)item;

    移除1个物理仿真元素

2.UIGravityBehavior常见属性

@property (nonatomic, readonly, copy) NSArray* items;

  添加到重力行为中的所有物理仿真元素

@property (readwrite, nonatomic) CGVector gravityDirection;

  重力方向(是一个二维向量)

@property (readwrite, nonatomic) CGFloat angle;

  重力方向(是一个角度,以x轴正方向为0°,顺时针正数,逆时针负数)

@property (readwrite, nonatomic) CGFloat magnitude;

  量级(用来控制加速度,1.0代表加速度是1000 points /second²)

二、碰撞行为

1.简介

说明:可以让物体之间实现碰撞效果

  可以通过添加边界(boundary),让物理碰撞局限在某个空间中

2.UICollisionBehavior边界相关的方法

- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier forPath:(UIBezierPath*)bezierPath;

- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier fromPoint:(CGPoint)p1 toPoint:(CGPoint)p2;

- (UIBezierPath*)boundaryWithIdentifier:(id <NSCopying>)identifier;

- (void)removeBoundaryWithIdentifier:(id <NSCopying>)identifier;

@property (nonatomic, readonly, copy) NSArray* boundaryIdentifiers;

- (void)removeAllBoundaries;

3.UICollisionBehavior常见用法

@property (nonatomic, readwrite) BOOL translatesReferenceBoundsIntoBoundary;

  是否以参照视图的bounds为边界

- (void)setTranslatesReferenceBoundsIntoBoundaryWithInsets:(UIEdgeInsets)insets;

  设置参照视图的bounds为边界,并且设置内边距

@property (nonatomic, readwrite) UICollisionBehaviorMode collisionMode;

  碰撞模式(分为3种,元素碰撞、边界碰撞、全体碰撞)

@property (nonatomic, assign, readwrite) id <UICollisionBehaviorDelegate> collisionDelegate;

  代理对象(可以监听元素的碰撞过程)

三、代码示例

在storyboard中拖拽几个控件,用于测试。

  

测试代码:

YYViewController.m文件  

 //
 //  YYViewController.m
 //  12-重力行为和碰撞行为
 //
 //  Created by apple on 14-8-6.
 //  Copyright (c) 2014年 yangyong. All rights reserved.
 //

 #import "YYViewController.h"

 @interface YYViewController ()
 @property (weak, nonatomic) IBOutlet UIView *redView;

 @property (weak, nonatomic) IBOutlet UIProgressView *block1;
 @property (weak, nonatomic) IBOutlet UISegmentedControl *block2;

 @property(nonatomic,strong)UIDynamicAnimator *animator;
 @end

 @implementation YYViewController
 -(UIDynamicAnimator *)animator
 {
     if (_animator==nil) {
         //创建物理仿真器(ReferenceView:参照视图,设置仿真范围)
         self.animator=[[UIDynamicAnimator alloc]initWithReferenceView:self.view];
     }
     return _animator;
 }
 - (void)viewDidLoad
 {
     [super viewDidLoad];

     //设置红色view的角度
     self.redView.transform=CGAffineTransformMakeRotation(M_PI_4);
 }

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {
     //1.重力行为
 //    [self testGravity];
     //2.重力行为+碰撞检测
 //    [self testGravityAndCollsion];
     //3.测试重力的一些属性
     [self testGravityAndCollsion2];
     //用2根线作为边界
 //    [self testGravityAndCollision3];
     //4.用圆作为边界
 //    [self testGravityAndCollision4];
 }

 /**
  *  重力行为
  */
 -(void)testGravity
 {
     //1.创建仿真行为(进行怎样的仿真效果?)
     //重力行为
     UIGravityBehavior *gravity=[[UIGravityBehavior alloc]init];
     //2.添加物理仿真元素
     [gravity addItem:self.redView];
     //3.执行仿真,让物理仿真元素执行仿真行为
     [self.animator addBehavior:gravity];
 }
 /**
  *  重力行为+碰撞检测
  */
 -(void)testGravityAndCollsion
 {
     //1.重力行为
     UIGravityBehavior *gravity=[[UIGravityBehavior alloc]init];
     [gravity addItem:self.redView];

     //2碰撞检测行为
     UICollisionBehavior *collision=[[UICollisionBehavior alloc]init];
     [collision addItem:self.redView];
     [collision addItem:self.block1];
     [collision addItem:self.block2];

     //让参照视图的边框成为碰撞检测的边界
     collision.translatesReferenceBoundsIntoBoundary=YES;

     //3.执行仿真
     [self.animator addBehavior:gravity];
     [self.animator addBehavior:collision];
 }

 /**
  *  测试重力行为的属性
  */
 -(void)testGravityAndCollsion2
 {
     //1.重力行为
     UIGravityBehavior *gravity=[[UIGravityBehavior alloc]init];
     //(1)设置重力的方向(是一个角度)
 //    gravity.angle=(M_PI_2-M_PI_4);
     //(2)设置重力的加速度,重力的加速度越大,碰撞就越厉害
     gravity.magnitude=;
     //(3)设置重力的方向(是一个二维向量)
     gravity.gravityDirection=CGVectorMake(, );
     [gravity addItem:self.redView];

     //2碰撞检测行为
     UICollisionBehavior *collision=[[UICollisionBehavior alloc]init];
     [collision addItem:self.redView];
     [collision addItem:self.block1];
     [collision addItem:self.block2];

     //让参照视图的边框成为碰撞检测的边界
     collision.translatesReferenceBoundsIntoBoundary=YES;

     //3.执行仿真
     [self.animator addBehavior:gravity];
     [self.animator addBehavior:collision];

 }

 /**
  *  用圆作为边界
  */
 - (void)testGravityAndCollision4
 {
     // 1.重力行为
     UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];
     [gravity addItem:self.redView];

     // 2.碰撞检测行为
     UICollisionBehavior *collision = [[UICollisionBehavior alloc] init];
     [collision addItem:self.redView];

     // 添加一个椭圆为碰撞边界
     UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(, , , )];
     [collision addBoundaryWithIdentifier:@"circle" forPath:path];

     // 3.开始仿真
     [self.animator addBehavior:gravity];
     [self.animator addBehavior:collision];
 }

 /**
  *  用2根线作为边界
  */
 - (void)testGravityAndCollision3
 {
     // 1.重力行为
     UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];
     [gravity addItem:self.redView];

     // 2.碰撞检测行为
     UICollisionBehavior *collision = [[UICollisionBehavior alloc] init];
     [collision addItem:self.redView];
     CGPoint startP = CGPointMake(, );
     CGPoint endP = CGPointMake(, );
     [collision addBoundaryWithIdentifier:@"line1" fromPoint:startP toPoint:endP];
     CGPoint startP1 = CGPointMake(, );
     [collision addBoundaryWithIdentifier:@"line2" fromPoint:startP1 toPoint:endP];
 //    collision.translatesReferenceBoundsIntoBoundary = YES;

     // 3.开始仿真
     [self.animator addBehavior:gravity];
     [self.animator addBehavior:collision];
 }
 @end

一些测试效果:

  

代码补充说明:

(1)加速度

速度:point/s

加速度:point/s²

1\2 * 加速度 * t²

 gravity.magnitude = 1000; // 重力加速度越大,碰撞越厉害

(2)重力的方向

  坐标如下:

  

重力方向(二维向量)

说明:给定坐标平面内的一个点。然后用原点(0,0)来连接它,就构成了一个向量。

注意:在IOS中以左上角为坐标原点,向右x增加,向下Y越大。

    

     //(3)设置重力的方向(是一个二维向量)
     gravity.gravityDirection=CGVectorMake(-, );

重力方向为左下角(西南)方向

(3)碰撞检测行为

  UICollisionBehavior *collision = [[UICollisionBehavior alloc] init];
     [collision addItem:self.redView];
     CGPoint startP = CGPointMake(, );
     CGPoint endP = CGPointMake(, );
     [collision addBoundaryWithIdentifier:@"line1" fromPoint:startP toPoint:endP];
     CGPoint startP1 = CGPointMake(, );
     [collision addBoundaryWithIdentifier:@"line2" fromPoint:startP1 toPoint:endP];

注意:标识符不能写空。可以写字符串,因为需要标识符需要遵守NSCopying协议,而字符串满足要求。

(4)贝赛尔曲线

  

提示:这里的path是一个圆,设置宽高不一样,那么得出来的就是一个椭圆。

iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)的更多相关文章

  1. 李洪强iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)

    iOS开发拓展篇—UIDynamic(重力行为+碰撞检测) 一.重力行为 说明:给定重力方向.加速度,让物体朝着重力方向掉落 1.方法 (1)UIGravityBehavior的初始化 - (inst ...

  2. iOS开发拓展篇—UIDynamic(简单介绍)

    iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟 ...

  3. iOS开发拓展篇—UIDynamic(捕捉行为)

    iOS开发拓展篇—UIDynamic(捕捉行为) 一.简介 可以让物体迅速冲到某个位置(捕捉位置),捕捉到位置之后会带有一定的震动 UISnapBehavior的初始化 - (instancetype ...

  4. iOS开发拓展篇—静态库

    iOS开发拓展篇—静态库 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开源库 公开源代码,能看到具体实现 ...

  5. iOS开发拓展篇—音效的播放

    iOS开发拓展篇—音效的播放 一.简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中 ...

  6. iOS开发拓展篇—音乐的播放

    iOS开发拓展篇—音乐的播放 一.简单说明 音乐播放用到一个叫做AVAudioPlayer的类,这个类可以用于播放手机本地的音乐文件. 注意: (1)该类(AVAudioPlayer)只能用于播放本地 ...

  7. iOS开发拓展篇—封装音频文件播放工具类

    iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...

  8. iOS开发拓展篇—CoreLocation简单介绍

    iOS开发拓展篇—CoreLocation简单介绍 一.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 (1)导航:去任意陌生的地方 (2)周边:找餐馆.找酒店.找银行.找电影院 ...

  9. iOS开发拓展篇—CoreLocation定位服务

    iOS开发拓展篇—CoreLocation定位服务 一.简单说明 1.CLLocationManager CLLocationManager的常用操作和属性 开始用户定位- (void)startUp ...

随机推荐

  1. ajax处理缓冲问题

    1.禁止页面缓存 header("Cache-Control:no-cache"); header("Pragma:no-cache"); header(&qu ...

  2. jquery实现标签上移、下移、置顶

    eg:如在后台的标签列表中,实现上移.下移.置顶功能 思路: 1.先用到的克隆方法.clone(true): 即把当前要移动的项先保存好,备于后用. 2.找到当前标签所对应的相关元素及其相关方法: 如 ...

  3. 受限玻尔兹曼机(RBM)学习笔记(一)预备知识

    去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算法原 ...

  4. 2013 Multi-University Training Contest 6

    HDU-4655 Cut Pieces 题意:有N个格子能够被涂色,每个格子能够涂1-ai 种颜色,当N=6,涂色方案:112233 认为方案中共有3个颜色块:涂色方案:121212 认为方案中共有6 ...

  5. vim编辑器编程配置

    打开/etc/vim/vimrc 添加命令: set cindent  "使用C样式的缩进 syntax on   "语法高亮 set tabstop=4 set softtabs ...

  6. [GeekBand] 面向对象的设计模式(C++)(1)

    一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心. 这样,你就能一次又一次 地使用该方案而不必做重复劳动. 0. 从面向对象谈起 底层思维与抽象思维: 底层思维要求程序员&q ...

  7. 轻松解决Win8.1连接受限或无法连接WiFi问题

    在无线网络连接设置窗口中,找到当前连接的无线网络“WLAN状态”,右击查看“状态”. 在“WLAN状态”窗口中找到“无线属性”. 进入“无线网络属性”窗口,切换到“安全”页面,点击“高级设置”.最重要 ...

  8. 特殊权限:SUID,SGID,Sticky

    特殊权限passwd:s SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者:    chmod u+s FILE    chmod u-s FILE        如果FIL ...

  9. Visual Studio使用正则表达式快速统计总共代码行数

    原文:Visual Studio使用正则表达式快速统计总共代码行数 按CTRL+SHIFT+F,勾上支持正则表达式,然后输入搜索内容: <span style="font-family ...

  10. ChromeDriver,IEDriver,Firefox配置

    ChromeDriver: 下载ChromeDriver.exe,放入某个文件夹,如C:\Program Files (x86)\Google\Chrome\Application,把此路径加入pat ...