美文网首页UIKitiOS Animation转场➕动画
IOS UIDynamic仿物理引擎-浮动碰撞效果

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

作者: Yan青天 | 来源:发表于2016-09-14 14:23 被阅读811次

最近产品提了个需求(电商的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

相关文章

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

    最近产品提了个需求(电商的APP-两鲜),需要在APP背景加上几个水果图案在那里无规则缓慢游荡。。。模仿 天天果园...

  • IOS 物理动画之碰撞、重力

    UIDynamic物理引擎UIDynamic是IOS7引入的一项新技术。他包括UIGravityBehavior:...

  • UIDynamic学习笔记-1

    UIDynamic是苹果IOS7才开始使用的一种技术,是一种物理引擎,实现例如重力,碰撞等现象。 Dynamic初...

  • iOS视频直播(物理仿真引擎全面了解)

    UIDynamic 物理仿真引擎全面了解 UIDynamic 是从 iOS 7开始引入的一种新技术,隶属于UIKi...

  • iOS物理引擎-UIDynamic

    UIKit动力学的引入,并不是为了替代CA或者UIView动画,在绝大多数情况下CA或者UIView动画仍然是最优...

  • IOS 物理引擎UIDynamic

    什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架可以认为是一种...

  • iOS UIDynamic物理效果

    各种碰撞、吸附、点击展开等物理视觉效果大都是通过UIDynamic来实现的 直接上代码看各种效果:

  • UIDynamic-iOS中的物理引擎

    UIDynamic-iOS中的物理引擎 创建一个物理仿真器 设置仿真范围 创建相应的物理仿真行为 添加物理仿真元素...

  • iOS滚珠菜单动效

    原型从网上找的,动效使用了CAAnimation和UIDynamic物理引擎。gitHub 大致步骤如下: 把效果...

  • UIDynamic物理引擎

    概述 最近群里有人私信我关于iOS物理引擎的知识,虽然UIDynamic在iOS7就引入了,但项目中还真没用到过,...

网友评论

  • 随风1112:您好,如果是多个圆形碰撞,并且初始位置不同,怎么计算角度和力,来保持它们一直碰撞反弹呢!望能解惑,万分感激。
  • 卟师:你好,我能转载分享吗?
    我会标注上作者和出处的
    Yan青天:@卟师 随意的

本文标题:IOS UIDynamic仿物理引擎-浮动碰撞效果

本文链接:https://www.haomeiwen.com/subject/snsvettx.html