IOS UIDynamic仿物理引擎-浮动碰撞效果

最近产品提了个需求(电商的APP-两鲜),需要在APP背景加上几个水果图案在那里无规则缓慢游荡。。。模仿 天天果园 APP的。好吧,那我就在网上找了很多文章,总结一下写个demo。效果如下:

Mou icon

这里用到的是UIDynamic这个类。

UIDynamic简介
  • 一、简介

    • UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架
      可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象如:重力、弹性碰撞等现象
    • 广泛用于游戏开发,经典成功案例是“愤怒的小鸟”让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏。
    • 注意:UIKit动力学的引入,并不是为了替代CA或者UIView动画,在绝大多数情况下CA或者UIView动画仍然是最有方案,只有在需要引入逼真的交互设计的时候,才需要使用UIKit动力学它是作为现有交互设计和实现的一种补充。
  • UIDynamic中的三个重要概念

    • Dynamic Animator:动画者,为动力学元素提供物理学相关的能力及动画,同时为这些元素提供相关的上下文,是动力学元素与底层iOS物理引擎之间的中介,将Behavior对象添加到Animator即可实现动力仿真。
    • Dynamic Animator Item:动力学元素,是任何遵守了UIDynamic协议的对象,从iOS7开始,UIView和UICollectionViewLayoutAttributes默认实现协议,如果自定义对象实现了该协议,即可通过Dynamic Animator实现物理仿真。
    • UIDynamicBehavior:仿真行为,是动力学行为的父类,基本的动力学行为类UIGravityBehavior、UICollisionBehavior、UIAttachmentBehavior、UISnapBehavior、UIPushbehavior以及UIDynamicItemBehavior均继承自该父类。
  • 物理仿真行为

    • UIGravityBehavior:重力行为

    • UICollisionBehavior:碰撞行为

    • UISnapBehavior:捕捉行为

    • UIPushBehavior:推动行为

    • UIAttachmentBehavior:附着行为

    • UIDynamicItemBehavior:动力元素行为(可以设置动画元素的属性,比如摩擦力,密度,弹性等等)

代码
因为项目需求在这里就不写重力行为,只需要推动行为和碰撞行为

 NSMutableArray *array  =[NSMutableArray array];
 for (int i = 0; i<5; i++) {
    srand((unsigned int)time(NULL));
    UIView *vienw = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
    vienw.backgroundColor = [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1];  //随机色
    [self.view addSubview:vienw];
    [array addObject:vienw];
    
    /*
    给每个物理元素(vienw)添加一个不同角度的推力 
    */
    UIPushBehavior *gravityBehavior = [[UIPushBehavior alloc]initWithItems:@[vienw] mode:UIPushBehaviorModeInstantaneous];
    //创建一个推力 
    //[gravityBehavior addItem:vienw];
    gravityBehavior.angle = i *0.15;  //设置推力的角度
    //加速度
    gravityBehavior.magnitude = 0.1; //加速度,越大力越大
    gravityBehavior.active = YES;  //激活力的作用
    [self.animater  addBehavior:gravityBehavior];//加入仿真器
    
}

UIDynamicItemBehavior * itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:array];    //将所有物理元素添加动力元素行为
itemBehavior.elasticity = 1;     //设置弹性越大弹的越猛(笔者试了几次,发现1是原来的力气反弹,比1大会弹回去加力,比1小会衰减)
itemBehavior.friction = 0;       // 磨擦力 
itemBehavior.density = 0.1;      //密度,,密度*体积等于质量 物理元素越大密度越大,越难推动
itemBehavior.resistance = 0;   // 抗阻力 0~CGFLOAT_MAX ,阻碍原有所加注的行为(如本来是重力自由落体行为,则阻碍其下落,阻碍程度根据其值来决定)
itemBehavior.allowsRotation = NO;是否允许旋转
[self.animater addBehavior:itemBehavior];

/*
    添加碰撞行为
*/

UICollisionBehavior *cont = [[UICollisionBehavior alloc]initWithItems:array];
cont.collisionDelegate = self;//(如果需要截获碰撞发生时的事件的话可以使用)
cont.collisionMode = UICollisionBehaviorModeEverything; 
//枚举:碰撞所有物体(包括边界 和 物理元素:该物理元素必须是该行为的元素数组,如果给每一个vienw实例化一个碰撞行为的话,他们之间是不会发生碰撞的)

cont.translatesReferenceBoundsIntoBoundary = YES;  //是否设置参照物为边界
//[cont setTranslatesReferenceBoundsIntoBoundaryWithInsets:UIEdgeInsetsMake(0, 0, 0, 0)];   //设置参照物为边界 ,并限制了边界范围;
// [cont addBoundaryWithIdentifier:@"conditon1" fromPoint:CGPointMake(0, 0) toPoint:CGPointMake(self.view.frame.size.width, self.view.frame.size.height)];设置两个点之间的连线为边界
[self.animater addBehavior:cont];

- (UIDynamicAnimator*)animater{
if (!_animater) {
//仿真器实例化
    _animater = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];  //参考视图
}
return _animater;

更多精彩请参考
http://www.jianshu.com/p/e096d2dda478
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 本文中所有代码演示均有GitHub源码,点击下载 UIDynamic简介 简介:UIKit动力学最大的特点是将现实...
    si1ence阅读 10,223评论 8 79
  • ————————————【 iOS—UIDynamic 】————————————— 一、简单介绍 1.什么是UI...
    北辰青阅读 1,630评论 0 1
  • 目录 ** UIView 动画 ** ** Core Animation ** ** FaceBook POP动画...
    方向_4d0d阅读 1,596评论 0 3
  • 1.1UIDynamic概述 UIKit动力学(Dynamic)最大的特点是将现实世界中动力驱动的动画引入了UIK...
    刘2傻阅读 324评论 0 0
  • 文/李胜梅 01 女儿快到入园的年龄了,焦虑已经提前来了,不是她,是我。 她会哭闹,会在家门口眼泪汪汪地说我不要...
    李胜梅阅读 1,777评论 9 22