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


要想做到这一点,我们得需要两个利器: UIKit Dynamics 和 Motion Effects。


1. UIKit Dynamics是UIKit中一套完整的物理引擎。它可以让我们在程序中对界面元素添加一些行为从而达到诸如重力、弹簧等现实中的动作行为。你只需在引擎中注册界面元素,并指定好物理行为,其他的事就交给物理引擎去完成了。

UIDynamicAnimation属于UIKit物理引擎中的类。它的作用是跟踪你添加到物理引擎中的各种行为动作,并且提供整个上下文。实例化UIDynamicAnimator时,它的构造函数需要传入一个referenceView参数,用于告知它要跟踪并制定坐标的View。


在UIKit的动态引擎中,每个行为都有一个action属性,它的类型是一个函数(()->Void)。

collision.action = {

println("\(NsstringFromCGAffineTransform(square.transform))(NsstringFromCGPointcenter)")

}



2. Motion Effects可以创建很酷的视觉效果,就像你iPhone上横竖屏切换时那样。它基于Apple提供的重力加速度提供的数据计算分析,使我们的界面元素根据移动设备的倾斜方向做出相应地反应。


物理引擎: UIDynamicAnimator

// 实例化UIKit物理引擎类,作用于ViewController的View

var animator: UIDynamicAnimator = UIDynamicAnimator(referenceView:self.view)



重力行为: UIGravityBehavior

UIGravityBehavior是一个模拟重力的模型,可作用于一个或多个元素。它的构造函数需要传入一个数组,该数组内容就是我们希望有重力表现的一个元素或多个元素。

// 实例化重力行为类,目前只作用于square控件

var gravity:UIGravityBehavior =UIGravityBehavior(items: [square])

// 角度 angle为0时,方块会水平向右移动,随着值得增大,方块会顺时针改变角度,不设置时默认是垂直向下移动。

gravity.angle =1.6

//速率 值越大下降的速度越快,当magnitude属性的值为0时,方块就不会下降了,所以最小的速率是0.1.

gravity.magnitude =0.1

// 将重力行为添加到UIKit物理引擎类中

animator.addBehavior(gravity)



// 碰撞行为: uicollisionbehavior

// 实例化碰撞行为类,目前只作用于控件square

var collision: uicollisionbehavior = uicollisionbehavior(items: [square])

// 将参考视图的边界作为碰撞边界,它德尔意思是将UIDynamicAnimator引用的View的边界作为碰撞行为的触发边界,这样就不用我们再去设置边界的坐标了。

collision.translatesReferenceBoundsIntoBoundary =true

// 为碰撞效果中添加一个隐形的边界。

collision.addBoundaryWithIdentifier("barrier",forPath:UIBezierPath(rect: barrier.frame)

// 将碰撞行为添加到UIKit物理引擎类中

animator.addBehavior(collision)

// 碰撞代理: uicollisionbehaviorDelegate

collision.collisionDelegate =self



// 关联行为: UIAttachmentBehavior

let attach:UIAttachmentBehavior = UIAttachmentBehavior(item: square1,attachedToItem: square2)

animator.addBehavior(attach)



// 用户交互行为: UISnapBehavior

当你点击屏幕时,UISnapBehavior行为会让对象像弹簧一样跳到你点击的那个位置。

var snap: UISnapBehavior!

overridefunc touchesEnded(touches: Set<NSObject>,withEvent event: UIEvent) {

ifsnap != nil {

animator.removeBehavior(snap)

}

let touch = (touches as NSSet).anyObject()as! UITouch

snap = UISnapBehavior(item:square,snapToPoint: touch.locationInView(view))

animator.addBehavior(snap)

}




//自定义行为: UIDynamcItemBehavior

let itemBehavIoUr =UIDynamicItemBehavior(items: [square])

itemBehavIoUr.elasticity =0.6

animator.addBehavior(itemBehavIoUr)


弹力(elaticity): 设置物体发生碰撞时的弹力,比如当物体碰撞时弹开的高度、角度的大小,物体的韧性等。

摩擦力(friction): 设置物体滑动时的摩擦力。

密度(density): 设置物体密度,密度越大加速度越大。

阻力(resistance): 设置物体滑动时的阻力,与friction不同的是,它只作用于线性滑动时。

角度阻力(angularResistance): 物体进行旋转运行时的阻力设置。

允许旋转(allowsRotation): 该属性并不是模拟现实中的一些行为属性,它是物体是否可以旋转的开关属性。








import UIKit


class ViewController: UIViewController,uicollisionbehaviorDelegate {


// UIKit物理引擎

var animator: UIDynamicAnimator!

// 重力行为

var gravity: UIGravityBehavior!

// 碰撞行为

var collision: uicollisionbehavior!

var firstContact = false

var square: UIView!

var snap: UISnapBehavior!

override func viewDidLoad() {

super.viewDidLoad()

// Do any additional setup after loading the view,typically from a nib.


square = UIView(frame: CGRectMake(100,100, 100))

square.backgroundColor = UIColor.cyanColor()

self.view.addSubview(square)

let barrier = UIView(frame: CGRectMake(0,300,140, 20))

barrier.backgroundColor = UIColor.redColor()

self.view.addSubview(barrier)

// 实现化UIKit物理引擎类,作用域ViewControllerView

animator = UIDynamicAnimator(referenceView: self.view)

// 实例化重力行为类,目前只作用于刚才创建的正方形View

gravity = UIGravityBehavior(items: [square])

// 角度

gravity.angle = 1.6

// 速率

// gravity.magnitude = 0.1

// 将重力行为添加到UIKit物理引擎类中

animator.addBehavior(gravity)

// 实例化碰撞行为类,目前只作用于刚才创建的正方形View

collision = uicollisionbehavior(items: [square])

collision.collisionDelegate = self

collision.addBoundaryWithIdentifier("barrier",forPath: UIBezierPath(rect: barrier.frame))

// 将参考视图的边界作为碰撞边界

collision.translatesReferenceBoundsIntoBoundary = true

// 将碰撞行为添加到UIKit物理引擎类中

animator.addBehavior(collision)

// collision.action = {

// println("\(NsstringFromCGAffineTransform(square.transform)) \(NsstringFromCGPoint(square.center))")

// }

let itemBehavIoUr = UIDynamicItemBehavior(items: [square])

itemBehavIoUr.elasticity = 0.6

itemBehavIoUr.density = 1

itemBehavIoUr.resistance = 0

itemBehavIoUr.angularResistance = 0

itemBehavIoUr.allowsRotation = true

animator.addBehavior(itemBehavIoUr)

// var updateCount = 0

// if updateCount % 3 == 0{

// let outline = UIView(frame: square.bounds)

// outline.transform = square.transform

// outline.center = square.center

//

// outline.alpha = 0.5

// outline.backgroundColor = UIColor.clearColor()

// outline.layer.borderColor = square.layer.presentationLayer().backgroundColor

// outline.layer.borderWidth = 1

// self.view.addSubview(outline)

// }

// ++updateCount

// }

}

override func touchesEnded(touches: Set<NSObject>,withEvent event: UIEvent) {

if snap != nil {

animator.removeBehavior(snap)

}

let touch = (touches as NSSet).anyObject() as! UITouch

snap = UISnapBehavior(item: square,135)"> animator.addBehavior(snap)

}

// MARK :-

// MARK :- uicollisionbehaviorDelegate

func collisionBehavior(behavior: uicollisionbehavior,beganContactForItem item: UIDynamicItem,withBoundaryIdentifier identifier: NScopying,atPoint p: CGPoint) {

let collidingView = item as! UIView

collidingView.backgroundColor = UIColor.yellowColor()

UIView.animateWithDuration(0.3,animations: {

collidingView.backgroundColor = UIColor.grayColor()

})

if !firstContact {

firstContact = true

let square = UIView(frame: CGRectMake(30,0, 100))

square.backgroundColor = UIColor.grayColor()

self.view.addSubview(square)

collision.addItem(square)

gravity.addItem(square)

let attach = UIAttachmentBehavior(item: collidingView,attachedToItem: square)

animator.addBehavior(attach)

}

}


override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

// dispose of any resources that can be recreated.

}



}

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_x_02_使用内置物理引擎

    最终效果图:一、新建工程进入cocos2d-x的tools下的bin目录:/Users/beyond/Desktop/cocos2d-x/cocos2d-x-3.3beta0/tools/cocos2d-console/bin目录打开终端,切换到上述bin目录使用cocos命令,创建工程,格式如下:cocosnew工程名-p包名-l语言-d目标文件夹,例如:cocosnew01_cocos2d-x

  6. Cocos2D OR libgdx for Android游戏开发

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

  7. cocos2d-x 物理引擎

    上面的例子代码流程:PhysicsBody对象创建Sprite对象创建PhysicsBody对象以组件的形式被添加到Sprite对象创建监听器以响应onContactBegin()事件刚体刚体描述了抽象物体的物理属性,包括:质量、位置、旋转角度、速度和阻尼。Cocos2d-x用PhysicsBody对象表示刚体。PhysicsWorld物理世界PhysicsWorld与场景进行了深入的整合,只需要调用Scene对象的initWithPhysics()方法,就可以创建一个包含物理世界的场景,注意在初始化的时

  8. 【Cocos Creator实战教程(8)】——打砖块(物理引擎)

    新建一个工程,取名叫做brick-breaker,brick是什么意思呢,就是砖块的意思,每次给工程起名字,我都能学会一个新单词。为什么不选kinematic呢?另外要设置wall,ground,paddle,brick的type为staticbrick的tag为1,ground的tag为2,paddle的tag为3,wall的tag位4下面来看脚本BrickLayout.js12345678910111213141516171819202122自己写了一个动态添加砖块的布局脚本,传入需要添加的砖块数量就

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

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

  10. 关于cocos2d中物理引擎碰撞掩码的设置

    当物理引擎检测到两个Body发送的碰撞信息后,会调用相应的时间方法来通知系统,比如两个Body已经发生碰撞,两个Body已经分离。同时导弹、飞船以及七边形只要碰撞都可以调用onContactBegin的方法注:会遇到使用默认值无法调用onContactBegin的方法,解决办法是对每个body重新设置三个掩码就能解决

随机推荐

  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,所以编译器会报错,现在来一一解决。

返回
顶部