现实生活中:

运动场物理仿真器

跑步物理仿真行为

人==仿真元素

创建步骤:

1.创建物理仿真器,并且指定仿真范围

2.创建物理仿真行为,并且指定仿真元素

3.将物理仿真行为添加到仿真器中

Demo:

#pragma mark -懒加载,创建物理仿真器,并且指定仿真范围

- (UIDynamicAnimator*)dynamicAni

  1. {
  2. if(!_dynamicAni) {
  3. // 1.创建物理仿真器,并且指定仿真范围
  4. _dynamicAni= [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
  5. }
  6. return_dynamicAni;
  7. }
  8. #pragma mark -点击屏幕响应事件
  9. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event
  10. {
  11. //获取当前触摸手指,以及位置
  12. //UITouch *touch = [touches anyObject];
  13. //CGPoint point = [touch locationInView:self.view];
  14. //重力
  15. [self gravity];
  16. //碰撞
  17. //[self collision];
  18. //吸附
  19. //[self snapWithPoint:point];
  20. }
  21. #pragma mark -重力
  22. - (void)gravity
  23. {
  24. // 1.创建物理仿真器,并且指定仿真范围
  25. // 2.创建物理仿真行为,并且指定仿真元素
  26. UIGravityBehavior*gravity = [[UIGravityBehavior alloc] initWithItems:@[self.purView]];
  27. //设置重力的方向
  28. //gravity.gravityDirection = CGVectorMake(1, 0);
  29. //gravity.gravityDirection = CGVectorMake(0, -1);
  30. //gravity.gravityDirection = CGVectorMake(1, 1);
  31. //设置重力的角度
  32. //gravity.angle = M_PI_2;
  33. //设置重力的加速度
  34. //gravity.magnitude = 100.0;
  35. // 3.将物理仿真行为添加到仿真器中
  36. [self.dynamicAni addBehavior:gravity];
  37. }
  38. #pragma mark -碰撞,有重力方能碰撞
  39. - (void)collision
  40. {
  41. // 1.创建物理仿真器,并且指定仿真范围
  42. // 2.创建物理仿真行为,并且指定仿真元素
  43. // 2.1创建重力仿真行为
  44. UIGravityBehavior*gravity = [[UIGravityBehavior alloc] initWithItems:@[self.purView]];
  45. gravity.magnitude=3;
  46. // 2.2创建碰撞仿真行为
  47. UICollisionBehavior*collision = [[UICollisionBehavior alloc] initWithItems:@[self.purView,self.redView]];
  48. //碰撞模式
  49. //collision.collisionMode = UICollisionBehaviorModeItems;
  50. //是否设置碰撞的边界,默认边界为物理仿真器边界
  51. //collision.translatesReferenceBoundsIntoBoundary = YES;
  52. //添加直线边界
  53. //[collision addBoundaryWithIdentifier:@"line" fromPoint:CGPointMake(0, 400) toPoint:CGPointMake(320, 500)];
  54. //添加图形的边界,贝赛尔曲线边界
  55. UIBezierPath*path = [UIBezierPath bezierPathWithOvalInRect:self.view.frame];
  56. [collision addBoundaryWithIdentifier:@"rect" forPath:path];
  57. // 3.将物理仿真行为添加到仿真器中
  58. [self.dynamicAni addBehavior:gravity];
  59. [self.dynamicAni addBehavior:collision];
  60. }
  61. #pragma mark -吸附
  62. - (void)snapWithPoint:(CGPoint)point
  63. {
  64. // 1.创建物理仿真器,并且指定仿真范围
  65. // 2.创建物理仿真行为,并且指定仿真元素
  66. UISnapBehavior*snap = [[UISnapBehavior alloc] initWithItem:self.purViewsnapToPoint:point];
  67. //设置吸附行为的"减震", 0.0~1.0
  68. snap.damping=.5;
  69. //注意:使用吸附行为,默认只有一次,如若想要多次必须移除之前的行为再重新添加
  70. [self.dynamicAni removeAllBehaviors];
  71. // 3.将物理仿真行为添加到仿真器中
  72. [self.dynamicAni addBehavior:snap];
  73. }
  74. #pragma mark - QZone
  75. - (void)QZoneAnimation
  76. {
  77. UIButton *addButton = [UIButton buttonWithType:UIButtonTypeContactAdd];
  78. addButton.center=CGPointMake(kScreenW/2,kScreenH-50);
  79. [addButton addTarget:self action:@selector(addButtonAction) forControlEvents:UIControlEventTouchUpInside];
  80. [self.view addSubview:addButton];
  81. //初始化弹出的控件
  82. UIView*view1 = [[UIView alloc] initWithFrame:CGRectMake(0,0,20,20)];
  83. view1.backgroundColor= [UIColor greenColor];
  84. view1.center=CGPointMake(kScreenW/2,kScreenH-50);
  85. view1.tag=101;
  86. UIView*view2 = [[UIView alloc] initWithFrame:CGRectMake(0,0,20,20)];
  87. view2.backgroundColor= [UIColor purpleColor];
  88. view2.center=CGPointMake(kScreenW/2,kScreenH-50);
  89. view2.tag=102;
  90. UIView*view3 = [[UIView alloc] initWithFrame:CGRectMake(0,0,20,20)];
  91. view3.backgroundColor= [UIColor cyanColor];
  92. view3.center=CGPointMake(kScreenW/2,kScreenH-50);
  93. view3.tag=103;
  94. [self.view insertSubview:view1 belowSubview:addButton];
  95. [self.view insertSubview:view2 belowSubview:addButton];
  96. [self.view insertSubview:view3 belowSubview:addButton];
  97. }
  98. #pragma mark - addButtonAction
  99. - (void)addButtonAction
  100. {
  101. //吸附
  102. //计算坐标
  103. CGPoint point1 =CGPointMake(kScreenW/2-50,kScreenH-60-50);
  104. CGPoint point2 =CGPointMake(kScreenW/2,kScreenH-60-100);
  105. CGPoint point3 =CGPointMake(kScreenW/2+50,kScreenH-60-50);
  106. CGPoint point =CGPointMake(kScreenW/2,kScreenH-50);
  107. UIView *view1 = (UIView*)[self.view viewWithTag:101];
  108. UIView *view2 = (UIView*)[self.view viewWithTag:102];
  109. UIView *view3 = (UIView*)[self.view viewWithTag:103];
  110. // 2.物理仿真行为
  111. UISnapBehavior*snap1 = [[UISnapBehavior alloc] initWithItem:view1 snapToPoint:point1];
  112. UISnapBehavior*snap2 = [[UISnapBehavior alloc] initWithItem:view2 snapToPoint:point2];
  113. UISnapBehavior*snap3 = [[UISnapBehavior alloc] initWithItem:view3 snapToPoint:point3];
  114. UISnapBehavior*snap4 = [[UISnapBehavior alloc] initWithItem:view1 snapToPoint:point];
  115. UISnapBehavior*snap5 = [[UISnapBehavior alloc] initWithItem:view2 snapToPoint:point];
  116. UISnapBehavior*snap6 = [[UISnapBehavior alloc] initWithItem:view3 snapToPoint:point];
  117. if(_isSnap) {
  118. [self.dynamicAniremoveAllBehaviors];
  119. // 3.将物理仿真行为添加到仿真器中
  120. [self.dynamicAni addBehavior:snap1];
  121. [self.dynamicAni addBehavior:snap2];
  122. [self.dynamicAni addBehavior:snap3];
  123. }else{
  124. [self.dynamicAni removeAllBehaviors];
  125. snap4.damping=.8;
  126. snap5.damping=.8;
  127. snap6.damping=.8;
  128. // 3.将物理仿真行为添加到仿真器中
  129. [self.dynamicAni addBehavior:snap4];
  130. [self.dynamicAni addBehavior:snap5];
  131. [self.dynamicAni addBehavior:snap6];
  132. }
  133. _isSnap= !_isSnap;
  134. }

重力:

碰撞:

吸附:

分散:

UIDynamic-吸附-重力-碰撞-物理仿真动画的更多相关文章

  1. UIDynamic(物理仿真)

    简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如: 重力.弹性碰撞等现象 物理引 ...

  2. 常见行为:仿真&重力&碰撞&捕捉

    一.UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架.可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象,重力.弹性碰撞等,游戏开发中很常见,例如愤怒的小鸟. 二.UI ...

  3. UIDynamic物理仿真

    UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象, 比如重力.弹性碰撞等现象,UIKit动力具有可组合.可重用和声明式 ...

  4. IOS开发-UIDynamic(物理仿真)简单使用

    UIDynamic是从IOS7开始引入的一种新技术,隶属于UIKit框架,我们可以认为是一种物理引擎能模拟和仿真现实生活中的物理现象,比如重力,弹性碰撞等. 可以让开发人员远离物理公式的情况下,实现一 ...

  5. 【探索之路】机器人篇(5)-Gazebo物理仿真环境搭建_让机器人运动起来

    如果完成了前两步,那么其实我们已经可以去连接我们的现实中的机器人了. 但是,做机器人所需要的材料还没有到,所以我们这里先在电脑平台上仿真一下.这里我们用到的就算gazebo物理仿真环境,他能很好的和R ...

  6. [pixhawk笔记]8-半物理仿真环境

    通过半物理仿真,可以在不试飞的情况下对飞控的软硬件进行部分验证,下面结合文档对半物理仿真环境的搭建和运行进行学习.先跑起来再说. Pixhawk支持多轴和固定翼的仿真,多轴用jMavSim,固定翼用X ...

  7. HTML5重力感应小球冲撞动画实现教程

    今天我们来分享一款很酷的HTML5重力感应动画教程,这款动画可以让你甩动页面中的小球,小球的大小都不同,并且鼠标点击空白区域时又可以生成一定数量的小球.当我们甩动小球时,各个小球之间就会发生互相碰撞的 ...

  8. 上海敏行医学招聘物理仿真,3D图形人才

    工作职能: 1.开发医学虚拟手术中的柔体仿真引擎/图形效果 2.柔体仿真引擎.和引擎开发主工程师一起完善和改进仿真引擎的开发工作. 3.3D图形效果的改进. 职位要求: 1.本科以上学历,1年以上c+ ...

  9. Canvas 数学、物理、动画学习笔记一

    Canvas 第五章 数学.物理和运动学习笔记让人映像深刻的运动,需要我们不只是简单的知道如何移动对象,还需要知道怎么按用户期望看到的方式去移动它们.这些需要基于数学知识的基本算法和物理学作用.基于点 ...

随机推荐

  1. Python爬虫教程-16-破解js加密实例(有道在线翻译)

    python爬虫教程-16-破解js加密实例(有道在线翻译) 在爬虫爬取网站的时候,经常遇到一些反爬虫技术,比如: 加cookie,身份验证UserAgent 图形验证,还有很难破解的滑动验证 js签 ...

  2. [翻译] 单例(Singleton)

    英文原文: https://sourcemaking.com/design_patterns/singleton 意图 确保一个类只有一个实例,并提供一个访问其实例的全局点: 封装 “即时初始化” ( ...

  3. Http超文本传输协议

    HTTP 简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传 ...

  4. Subversion FAQ(常见问题解答)

    转自:http://subversion.apache.org/faq.zh.html 常见问题: 为什么会有这样一个项目? 为了接管CVS的用户基础.确切的说,我们写了一个新的版本控制系统,它和CV ...

  5. python 生成器&迭代器

    列表生成式 要生成[1x1, 2x2, 3x3, ..., 10x10]>>> [x * x for x in range(1, 11)]for循环后面还可以加上if判断>&g ...

  6. AutoHotkey调用VBA实现批量精确筛选数据透视表某字段内容。

    如上图,想在数据透视表中只显示红色区域的内容,手动勾选就比较繁琐. 实现思路: 先复制红色的内容. 鼠标停留在数据透视表[型号]列的任意数据上(通过该单元格可以获取数据透视表和字段) 由于数据透视表的 ...

  7. SAP技术专家的ABAP调试器培训材料

    首先弄清楚ABAP Classic调试器和新调试器的区别: Classic debugger: (1) Static breakpoint a. BREAK-POINT : non-user spec ...

  8. 如何玩转Android远控(androrat)

    关于WebView中接口隐患与手机挂马利用的引深 看我是怎样改造Android远程控制工具AndroRat 1.修改布局界面 2.配置默认远程ip和端口 3.LauncherActivity修改为运行 ...

  9. QuantLib金融库的简易安装

    最近在弄毕设,研究关于固定收益债券定价方面的知识,需要使用到QuantLib这个Python金融库,但是这是一个C++编译的库,官网也只给出了源代码,安装起来十分繁琐,所以在网上找了一个简易的安装方法 ...

  10. Vue通过input筛选数据

    <div id="app"> <input v-model='search' /> <ul> <li v-for="item i ...