重力学这个名词不论在哪个行业领域听起来似乎都很高大上。那么在Swift中的重力学是什么呢?那就是将我们移动端屏幕上毫无生命力的东西也置于万有引力中,使它们能够展现出好像真的由于引力而向下坠落以及碰到物体后自然的弹开的效果。

要想做到这一点,我们得需要两个利器:UIKit DynamicsMotion Effects

  • UIKit DynamicsUIKit中一套完整的物理引擎。它可以让我们在程序中对界面元素添加一些行为从而达到诸如重力、弹簧等现实中的动作行为。你只需在引擎中注册界面元素,并指定好物理行为,其他的事就交给物理引擎去完成了。
  • Motion Effects可以创建很酷的视差效果,就像你iPhone上横竖屏切换时那样。它基于Apple提供的重力加速器提供的数据计算分析,使我们的界面元素根据移动设备的倾斜方向做出相应的反应。

当这两者一起使用的时候,我们就可以让程序活起来,富有生命力。

让我们开始屌丝的逆袭

我们挑一些小例子来学习UIKit Dynamics

注:由于个人编码习惯,在Swift代码中我还是加了;,其实可加可不加,根据大家喜好。

打开Xcode6新建项目,选择iOS Application/Single View Application,名称随便取,我这里命名为UIKitDynamicsDemo,我们可以看到Single View Application的目录结构:

打开ViewController.swift文件,在viewDidLoad方法中添加如下代码:

// 创建一个正方形View,颜色设置为蓝绿色,加入当前的View中
let square = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100));
square.backgroundColor = UIColor.cyanColor();
self.view.addSubview(square);

上面的代码在我们的屏幕上添加了一个蓝绿色的正方形UIView。运行一下,我们能看到一个木讷的蓝绿色正方形静静的待在屏幕中:

如果你用真机运行,你可以摇晃一下手机、倾斜手机、拿着手机手舞足蹈一下,看看那个木讷的方块有什么反应和变化么?答案是要有反应你就见鬼了。因为我们写的这几行代码只能让它杵在那一动不动,那怎么能让它动起来呢?接下来让我们见证奇迹的时刻!

添加重力行为

ViewController.swift文件中添加两个属性:

// UIKit物理引擎 var animator: UIDynamicAnimator!; // 重力行为 var gravity: UIGravityBehavior!;

注:代码中感叹号的作用这里不做过多介绍,请自行查阅官方文档。

然后在viewDidLoad方法中再加入以下代码:

// 实例化UIKit物理引擎类,作用于ViewController的View animator = UIDynamicAnimator(referenceView: self.view); // 实例化重力行为类,目前只作用于刚才创建的正方形View gravity = UIGravityBehavior(items: [square]); // 将重力行为添加到UIKit物理引擎类中 animator.addBehavior(gravity);

现在再编译运行一下,这时我们可以看到这个蓝绿色正方形开始做自由落体运动了,一直跌落出屏幕下边缘然后消失。

我们来看看刚才我们添加的两个属性的类型:

    UIDynamicAnimator属于UIKit物理引擎中的类。它的作用是跟踪你添加到物理引擎中的各种行为动作,比如这里的重力行为,并且提供整个上下文。实例化UIDynamicAnimator时,它的构造函数需要传入一个referenceView参数,用于告知它要跟踪并制定坐标的View
  • UIGravityBehavior是一个模拟重力的模型,可作用于一个或多个元素。它的构造函数需要传入一个数组,该数组的内容就是我们希望有重力表现的一个元素或多个元素。

大多数的行为都有一些配置属性,比如重力行为就有可以改变角度和速率的属性:

// 实例化UIKit物理引擎类,目前只作用于刚才创建的正方形View animator = UIDynamicAnimator(referenceView: self.view); // 实例化重力行为类,目前只作用于刚才创建的正方形View gravity = UIGravityBehavior(items: [square]); // 角度 gravigy.angle = 1.6; // 速率 gravigy.magnitude = 0.1; // 将重力行为添加到UIKit物理引擎类中 animator.addBehavior(gravity);

上述代码中的angle是重力行为的角度属性,angle的值为0时,方块会水平向右移动,随着值的增大,方块会顺时针改变角度。不过我们要模拟现实中的重力,所以该属性一般不设置,不设置时默认是垂直向下移动。magnitude是重力行为的速率属性,值越大下降的速度越快,当magnitude属性的值为0时,方块就不会下降了,所以最小的速率是0.1。

注意:在现实世界中,重力加速度大约是g = 9.80665m/s^2,就是9.8米每平方秒。根据牛顿第二定律,我们可以使用0.5 * g * Time^2公式来计算下坠距离。
在UIKit的重力世界中,计算重力加速度的公式是一样的,但是单位有所不同。不是米而是像素,即g = 1000pixels/s^2,我们同样可以使用牛顿第二定律来计算我们的方块在单位时间内下降的距离。我们只需要知道重力加速度g越大,坠落速度越快,所以上述代码中的magnitude属性就差不多是这意思。

不能让我们的方块一坠千里

从目前代码的运行状况知道,我们的方块下降到屏幕底部时丝毫没有停止的意思,直接坠崖而下,看都看不见。我们希望我们的屏幕类似一个盒子一样,方块在盒子中,当下降到底部时就停止,那么我们就需要设置一个边界。

ViewController.swift文件中再添加一个属性:

// 碰撞行为 var collision: uicollisionbehavior!;

然后在viewDidLoad方法中加入以下几行代码:

// 实例化碰撞行为类,目前只作用于刚才创建的正方形View collision = uicollisionbehavior(items: [square]); // 将参考视图的边界作为碰撞边界 collision.translatesReferenceBoundsIntoBoundary = true; // 将碰撞行为添加到UIKit物理引擎类中 animator.addBehavior(collision);

上面的代码创建了边界行为,它会将一个或多个边界与指定的View联系起来,并使两者有具有交互行为。

从上面代码我可以注意到collision.translatesReferenceBoundsIntoBoundary = true;这行代码,它的意思是将UIDynamicAnimator引用的View的边界作为碰撞行为的触发边界,这样就不用我们再去设置边界的坐标了,非常好用。

接着我们编译运行看看,此时小方块坠落到屏幕底部时会产生碰撞效果,并且还会反弹几下,是不是很逼真呢。

碰撞行为进阶应用

接下来我们在屏幕中再添加一个View,长方形并横在屏幕中间,在// 创建一个长方形View,颜色设置为红色,加入当前的View中 let barrier = UIView(frame:CGRect(x: 0, y: 300, width: 140, height: 20)); barrier.backgroundColor = UIColor.redColor(); self.view.addSubview(barrier);

Swift中的UIKit动力学的更多相关文章

  1. ios – 仅用于碰撞检测,Chipmunk或Box2d是更好的工具吗?

    对于基于Cocos2d的项目,我只想使用物理工具包进行碰撞检测.使用Chipmunk或Box2d有什么优缺点?解决方法我们在谈论什么样的碰撞?根据什么使你更容易使用你的决定而不是一个任意的,未定义的,高度主观的关于一个物理引擎是否比另一个更好的想法,因为技术差异是微不足道的,你只能评估他们对如果你们都知道你自己的游戏设计和物理引擎内部算法,你的游戏设计真的很好.

  2. Swift中的UIKit重力学

    实例化UIDynamicAnimator时,它的构造函数需要传入一个referenceView参数,用于告知它要跟踪并制定坐标的View。collision.translatesReferenceBoundsIntoBoundary=true//为碰撞效果中添加一个隐形的边界。UITouchsnap=UISnapBehavioranimator.addBehavior}//自定义行为:UIDynamcItemBehaviorletitemBehavIoUr=UIDynamicItemBehaviorite

  3. Swift中的UIKit动力学

    添加重力行为在ViewController.swift文件中添加两个属性://UIKit物理引擎varanimator:UIDynamicAnimator!在UIKit的重力世界中,计算重力加速度的公式是一样的,但是单位有所不同。从上面代码我可以注意到collision.translatesReferenceBoundsIntoBoundary=true;这行代码,它的意思是将UIDynamicAnimator引用的View的边界作为碰撞行为的触发边界,这样就不用我们再去设置边界的坐标了,非常好用。

  4. 怎样在CocosCreator中使用物理引擎关节

    这篇文章主要介绍了怎样在CocosCreator中使用物理引擎关节,对物理引擎感兴趣的同学,着重要看一下

  5. Cocos2d-js_____Chipmunk物理引擎

    在游戏中引入Chipmunk物理引擎介绍Cocos2d-html5能让我们创造出让人印象深刻的游戏世界,但是它缺乏现实性。在这个教程里,我们将会讲解如何把Chipmunk物理引擎加入到我们的游戏中。我们之所以选择Chipmunk物理引擎是因为它比其他2D物理引擎更加强大。在Cocos2d-html5使用Chipmunk物理引擎准备首先,让我们在Cocos2d-html5中启用Chipmunk打开*Cocos2d.js*文件,并修改:为:chipmunk:true,250)">这样当Cocos2d-html

  6. Cocos2d-x中Physics物理引擎碰撞检测,setCategoryBitmask,setContactTestBitmask,setCollisionBitmask

    看了一篇文章,然后自己测试了一下,应用起来应该是对的。之前阅读过的详细讲解物理世界的创建创建物理边界,首先Scene应该是包含物理效果的,如上方式创建的创建物理碰撞体这样精灵就能受物理世界影响了。还可以写成其他格式,如下:下面来说作用和区别实例分析:算了,实例有点复杂,自己一个一个去试就好了

  7. cocos2dx-3.x 修改默认物理引擎为Box2D

    cocos2dx-3.x修改默认物理引擎为Box2D自3.0版本起,用户可以方便的根据宏来选择物理引擎。Cocos默认物理引擎为Chipmunk,如果要使用Box2D,只需要修改一下宏定义即可。Mac/iOS平台将引擎改为Box2D有两个方法:1、修改源码:在“CCPhysicssprite.cpp”中添加:2、更改预编译宏:修改cocos2d_libs->Project->BuildSettings->PreprocessorMacros->Debug/Release中(如下图)的宏即可。删除“CC_E

  8. Cocos2d-x之初级物理引擎

    一切故事发生的背景同济大学软件学院每个学期会要求学生独立或者组队完成一个大项目,于是2016年的大项目是用cocos2d-x这款引擎制作一个自己的游戏。之前写了一篇cocos2d-x关于键盘按住事件的教程,不足之处还请大家多多指出。物理引擎的基础两种物理引擎根据官方文档的介绍,目前有两大重要的物理引擎,Box2D和Chipmunk,并且cocos2d-x已经集成了它们,在3.x版本中可基于Chipmunk的核心API的物理引擎使用。一句话:cocos2d-x3.x版本中使用Chipmunk物理引擎更加方便

  9. Cocos2d-x 3.x学习笔记:猩先生带你打飞机(三)物理引擎的使用

    物理引擎的使用为了方便碰撞检测,我使用了cocos2d集成的物理引擎,cocos2d有两种物理引擎,一种轻量级的Chipmunk,一种相对Chipmunk比较复杂的Box2d,在3.x版本cocos2d封装了Chipmunk的api,简单好用,在项目中就是使用了这种物理引擎。参照下这篇文章http://cn.cocos2d-x.org/tutorial/show?CategoryBitmask值为0xFFFFFFFF,ContactTestBitmask值是00000000,而CollisionBitma

  10. 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第二十六课:Cocos2D-X物理引擎之Box2D11-12

    Cocos2d-X跨平台游戏开发---学习笔记第二十六课:Cocos2D-X物理引擎之Box2D11-12=======================================================================================================================================================================课程目标:-学习Box2D课程重点:-Box2D概念-Box2D常用操

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部