UIDynamic(一)

前言

  • 最近看了一下UIDynamic,UIDynamic是13年WWDC出的技术。其实本人一直热衷于比较有趣的动画,特别是带物理力学的动画,感觉物理力学就是动画的灵魂,一直想找几个小伙伴把物理与动画结合起来,做一下类似于物理引擎的迷你版玩玩,但是由于可支配时间不多,以至于这个夙愿未能完成,但发现UIDynamic这套UIKit自带的物理引擎也挺好玩的,所以先玩几天把,好了,废话不多说,直入正题。

基础

  • 概念

    • UIDynamicItem:一个控件想要执行UIDynamicAnimator的动画就必须要继承这个协议。

    • UIDynamicAnimator:Animator为动态控件提供物理相关的力学和动画,也为这些动画提供了上下文,通过添加Behavier实例来实现想要的动画效果,在以下介绍到的物理力学里面一切动画的源头都是他,也可以说,UIKit的动力学最外层的包装就是它。

    • ReferenceView:在初始化UIDynamicAnimator的时候有一个叫做referenceView的属性,他是你的参考视图,你的子控件以及子控件的Beahavier就是参考这个视图的坐标的。

    • UIDynamicBehavior:它可以看做是把一种物理行为封装起来的一个类,一个Behavior实例可以赋予多个动态控件的一个物理行为。

  • 扩展

    • 一个动态控件可以是任何遵循UIDynamicItem协议的iOS或者自定义对象,UIView和UICollectionViewLayeroutAttributes类都实现了这个协议,你可以自定义遵循这个协议的的控件来使用这个物理动画。
  • 层次

    • UIDynamicBehavior苹果官方提供了六种物理行为的封装,换言之,苹果官方对外只提供了六种基本的物理行为,但你可以自定义符合的物理行为,不过你自定义的这个行为必须继承UIDynamicBehavior.其层次如下

UIDynamicBehavio层次图

应用场景

  • UIGravityBehavior:重力行为,来个自由落体
     self.animator = UIDynamicAnimator(referenceView: self.view)
var gravity = nil
gravity = UIGravityBehavior(items: [littleBall])
self.animator.addBehavior(gravity)
  • 效果图如下
    由于本人用的是黑苹果,所以模拟器上会有些闪屏

我们还可以通过magnitude来设置重力加速度,值得一提的是,学过物理的同学应该知道这个吧,不过苹果这里面跟现实还是有些出入的,就像我们现实中g是9.8m/s²,而在UIKit中定义了g是1000 points / second²,换言之,如果一开始我们的速度为0,那么一秒后我们的速度是1000个点/秒

  • UICollisionBehavior:碰撞检测行为,是不是觉得感觉自由落体没有真实感,这个可以是我们的屏幕添加地面
       collision = nil
collision = UICollisionBehavior(items: viewArr)
collision.collisionDelegate = self
collision.addBoundaryWithIdentifier("path", fromPoint: CGPointMake(, self.view.frame.height), toPoint: CGPointMake(self.view.frame.width, self.view.frame.height))

注意:我们可以设置UICollisionBehavior的代理,来监听碰撞的行为,我们可以同translatesReferenceBoundsIntoBoundary这个属性来让我们的参考视图边界作为我们的墙壁,也可以通过这个addBoundaryWithIdentifier来设置我们的墙壁

  • UIDynamicItemBehavior:设置每个动态控件的自身属性,提供一下属性

    • elasticity:弹力
    • friction:摩擦力
    • density:密度
    • resistance:阻力
    • angularResistance:角阻力
    • allowsRotation:允许旋转
  • 我们暂且用这几个物理行为来做一个比较有趣的动画

 

这个的主要思路如下

  • 重力行为,碰转行为,属性行为

  • 定时器不断加小球,定时器可以选择NSTimer,CADisplayLink以及GCD,前两个不怎么准确,有时还会跳过任务,所以这里我选择了GCD定时器,NSTimer和CADisplayLink底层也是调用GCD定时器的。

  • 当小球消失在屏幕中回收内存,这里我是在碰撞代理方法里面回收,也可以用KVO监听来回收内存,但系统自带的KVO好像不好使,可以试一下Observable-Swift这个框架,里面很好的利用了Swift的泛型来实现的。

//        添加GCD定时器,比CADisplayLink和NSTimer更精确,受限制较小
let queue:dispatch_queue_t = dispatch_get_main_queue() self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, , , queue) let start:dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64((UInt64(1.0) * NSEC_PER_SEC))) let interval:UInt64 = UInt64((UInt64(10.0) * NSEC_PER_SEC)/) dispatch_source_set_timer(self.timer, start, interval, )
dispatch_source_set_event_handler(self.timer, { () -> Void in
self.addABall()
})
dispatch_resume(self.timer)
// addBall()方法里面
let littleBall:LittleBall = LittleBall(frame: CGRectMake(self.view.center.x, CGFloat(arc4random_uniform(UInt32())) * -, , ))
littleBall.backgroundColor = self.randomColor();
littleBall.layer.cornerRadius =
self.view.addSubview(littleBall) viewArr += [littleBall] gravity = nil
gravity = UIGravityBehavior(items: viewArr)
gravity.magnitude = collision = nil
collision = UICollisionBehavior(items: viewArr)
collision.collisionDelegate = self
collision.addBoundaryWithIdentifier("path", fromPoint: CGPointMake(, self.view.frame.height), toPoint: CGPointMake(self.view.frame.width, self.view.frame.height)) itemBehavior = nil
itemBehavior = UIDynamicItemBehavior(items: viewArr)
itemBehavior.elasticity = 0.5 self.animator.removeAllBehaviors()
self.animator.addBehavior(gravity)
self.animator.addBehavior(itemBehavior)
self.animator.addBehavior(collision)
//在代理方法里面
let view:UIView = item as! UIView if view.frame.origin.x < || view.frame.origin.x > self.view.frame.width{
let arr:NSMutableArray = NSMutableArray(array: self.viewArr)
view.removeFromSuperview()
arr.removeObject(view)
self.viewArr = arr as [AnyObject]
}

UIDynamic(一)的更多相关文章

  1. UIDynamic(简单介绍)

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

  2. 实现步骤: 推送&传感器&UIDynamic

    一.本地通知基本使用: #01.请求授权(8.0以前默人授权) #02.创建本地通知 #03.设置通知内容 #04.设置通知时间(多久后发通知) #05.发送通知 二.本地通知而外设置: #01.设置 ...

  3. iOS开发——高级篇——UIDynamic 物理引擎

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

  4. UIDynamic动画

    UIDynamic是从iOS7开始引入的技术 属于UIkit框架 可以模拟显示生活中的物理现象 如碰撞 抖动 摆动等 一.使用UIDynamic步骤: 1.创建一个动力效果器UIDynamicAnim ...

  5. UIDynamic(物理仿真)

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

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

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

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

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

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

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

  9. UIDynamic仿物理引擎-浮动碰撞效果-b

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

  10. UIDynamic 基础认识

    UIDynamic 是从iOS 7开始引入的一种新技术,属于UIKit框架,可以模拟现实生活中的物理现象,如:碰撞.抖动.摆动等 动力效果:有一个效果器,叫做“动力效果器”里面面可以添加“动力效果” ...

随机推荐

  1. 212. Word Search II

    题目: Given a 2D board and a list of words from the dictionary, find all words in the board. Each word ...

  2. MediaPlayer中创建AudioTrack的过程

    使用MediaPlayer播放音视频时,会创建AudioTrack对象用于播放音频数据.下面就来看看MediaPlayer创建AudioTrack的过程: 1.创建AudioTrack对象MediaP ...

  3. CentOS6脱机rpm安装MariaDB10

    转载请保存原文链接:http://www.wlm.so/Article/Detail/lmb4cijci5mc900000 1.卸载原有mysql安装包,避免安装文件冲突 #查找所有的mysql包 r ...

  4. 从算法入手讲解如何在SQL Server中实现最优最简

    算法是计算机科学中一个重要的研究方向,是解决复杂问题的关键.在计算机世界中,算法无处不在.数据库是存储数据和执行大批量计算的场所,在数据库中使用一些简单的SQL命令,进行存储.查询.统计.以解决现实世 ...

  5. apache开源项目--OpenMeetings

    OpenMeetings是一个多语言可定制的视频会议和协作系统.它支持音频.视频,能让你查看每个与会者的桌面.OpenMeetings还包含一个白板,通过白板可以导入各种格式的图片和涂鸦. 在线演示: ...

  6. 逻辑回归损失函数(cost function)

    逻辑回归模型预估的是样本属于某个分类的概率,其损失函数(Cost Function)可以像线型回归那样,以均方差来表示:也可以用对数.概率等方法.损失函数本质上是衡量”模型预估值“到“实际值”的距离, ...

  7. 15个极好的Linux find命令示例(二)

    前阵子,我们审查了15件实事 find命令的例子(第一部分).查找命令可以做很多比只是在寻找基于名称的文件 (第2部分)在这篇文章中,让我们来讨论15高级find命令的例子, 包括-根据它访问,修改或 ...

  8. 【转】 C++中如何在一个构造函数中调用另一个构造函数

    在C++中,一个类的构造函数没法直接调用另一个构造函数,比如: #ifndef _A_H_ #define _A_H_ #include <stdio.h> #include <ne ...

  9. Discuz!NT中的Redis架构设计

    在之前的Discuz!NT缓存的架构方案中,曾说过Discuz!NT采用了两级缓存方式,即本地缓存+memcached方式.在近半年多的实际运行环境下,该方案经受住了检验.现在为了提供多样式的解决方案 ...

  10. HttpServerUtility类

    HttpServerUtility是一个工具类,为了在后台处理请求方便获取到一些常用的类型,Asp.net将很多常用的东西封装到这里. 比如可以使用其进行URL编码解码, HTML编码解码等. // ...