在介绍iOS7中苹果已经说得很清楚了,他们致力于设备和现实生活的交互行为。一个被介绍的新的API是UIKit Dynamics -- 一个在UIkit框架下的二维物理现象发动机。
为了模拟现实生活中的物理现象我们使用UIDynamicBehavior子类,这些子类适用接受UIDynamicItem协议对象的不同行为。很多行为的了例子包括:gravity(重力), collisions(碰撞) and springs(弹簧)。虽然你可以自己子类化接受UIDynamicItem协议的对象,但是很显然UIView已经自己做了。UIDynamicBehavior 对象们可以复合在一起形成一个特定的行为对象,这个行为对象有着这些对象的各种行为。
一旦我们指定给我们的dynamic 对象一些特定的行为,我们可以为它创造一个UIDynamicAnimator实例--物理引擎。这玩意计算决定着不同的对象应该如何展现他们的行为。下面的这图宏观的概述了UIKit Dynamics原理世界:
建立一个钟摆实验
让我们回顾一下高中的学科---在牛顿物理学中,一个最简单的项目就是钟摆实验了。现在就让我们利用视图来呈现球的摇摆吧。
现在我们能给找这球加上些有趣的行为了.我们能够创造一个对象来复合多种行为:
接下来我们将添加一系列我们想要模拟的行为 --首先就是地球引力了:
UIGravityBehavior 呈现出一个物体和地球之间的万有引力。这个类有很多属性让你能够描述万有引力手里的矢量(包括大小和方向)。现在我们加大这个力的大小并保持在y的方向增长。另一个行为我们需要加小球上的是一个附属行为 -- 用一根线把它给挂住:
UIAttachmentBehavior实例对象依附一个锚点或者另外一个物体。他有属性可以控制附加线的行为--(可以指定)频率,阻尼,线长。默认值保证了一个完整且严格的附加行为,这正是我们钟摆实验所希望的。
现在小球所有的行为都被指定了我们可以创造一个物理引擎UIDynamicAnimator的对象_animator:
UIDynamicAnimator提供了模拟这个实验的物理引擎。这里我们创造它并指定相关联的视图(比如空间宇宙)然后添加我们刚刚创造的复合型行为。
刚刚做的这些我们就建立了我们第一个UIKit Dynamics系统。然而,你现在去跑这个工程,啥都不会发生。这是因为这个系统开始在一个平衡的状态下--我们应该去打扰这个平衡状态,让它动起来。
手势驱动行为
我们需要为小球添加一个手势这样用户就可以做这个实验了。
在这个手势响应方法里面我们施加一个恒力行为在小球上
UIPushBehavior 对物体施加一个线性的力。当我们手势响应开始,我们创造UIPushBehavior的对象_userDragBehavior,记住把它加在_animator上。为了水平方向速度的转移,我们需要设置合适力的大小。为了使这个摆钟摇摆,在手势结束的时候我们移除_userDragBehavior对象。
目前为止这个实验看起来是这样的:
包含多个摇摆小球
牛顿的实验的是一个布置好的多个摇摆小球,这样这些小球几乎都是接触的。
为了创造这个UIKit Dynamics我们需要创造多个摇摆小球 - 就和上面我们创造的模式一样的。他们应该被好好放置确保没有完全接触。
我们也需要添加一个新的行为来描述他们之间是如何碰撞的。现在我们需要一个储存小球的数组NSArray *_ballBearings;:
我们使用了一种碰撞行为和一系列对象来模拟这个实验。碰撞行为还可以用于模拟对象达到边界如视图边界,或任意的贝塞尔曲线路径的界限。
如果你现在运行工程,你试着去移动某个摇摆小球你会发现这个装置并没有出现你想要的结果。因为目前来说这些碰撞并不是弹性的。我们需要添加一种特殊类型的动态行为来指定不同的共享属性:
我们使用UIDynamicItemBehavior 来指定碰撞的弹性,阻力(大多是空气阻力)还有旋转。如果我们允许旋转我们可以指定角阻力。UIDynamicItemBehavior还允许设置线速度和角速度,这对匹配 速度时 的手势是非常有用的。
再次运行工程的时候这个牛顿摇摆装置就和现实生活的实验表现的一样了。作为扩展,你可以去画一下连接小球儿和钟摆之间的线。
伴随着这篇文章的代码代表了牛顿的摇篮项目完成。它使用了上面所有被提到的类和对象,但也只是在这个工程里面做了浅薄的探索。
结论
这篇文章介绍UIKit Dynamics还是远远不够的--这些模块可以为非常复杂的物件系统建模。这为那些深受现实生活对世界的运动和对象交互固有理解的APP打开了一扇门
github地址:github.com/ShinobiControls/iOS7-day-by-day
原文地址 :https://www.shinobicontrols.com/blog/ios7-day-by-day-day-0-uikit-dynamics