基本概念:

  • UIDynamic Animator用于存放要使用的力学行为(UIDynamicBehavior). 它的ReferenceView指向了要呈现的视图。

swift

  • 力学行为: 力学行为有6个子类 (添加力学行为:addBehavior)

    • UIGravityBehavior重力
    • UICollisionBehavior碰撞
    • UIAttachmentBehavior吸附
    • UIPushBehavior
    • UISnapBhavior
    • UIDynamicItemBehavior 行为限制
  • 力学项目UIDynamicItem:每个力学行为都有多个力学项目

力学行为特征

下面分别介绍力学行为

  • 重力行为 UIGravityBehavior 重力行为能模拟视图对象收到重力的效果。 根据牛顿定律,物体下落加速度为g,而在数字世界g = 9.8点/s^2
	//重力行为
	//初始UIDynamicAnimator对象
	let animator = UIDynamicAnimator(referenceView: self.view)
	//创建behavity对象,同时指定了它要模拟重力行为运动的视图对象集合
	let gravity = UIGravityBehavior(items: [])
	//将力学行为加到UIDynamicAnimator对象中
	animator.addBehavior(gravity)
  • 碰撞行为
   let collison = UICollisionBehavior(items: [])
   //检测是否与ReferenceView边界碰撞
   collison.translatesReferenceBoundsIntoBoundary = true
   
   //检测是否与其他物体边界碰撞的方法如下:
   //设置一个碰撞的贝塞尔曲线,第一个参数是定义一个标示,第二个参数是设置贝塞尔曲线,参数类型为UIBezierPath
   collison.addBoundaryWithIdentifier(<#T##identifier: NSCopying##NSCopying#>, forPath: <#T##UIBezierPath#>)
   //设置一个可碰撞线段,第一个参数是定义一个标示,第二个参数是设置起点,第三个是结束点
   collison.addBoundaryWithIdentifier(<#T##identifier: NSCopying##NSCopying#>, fromPoint: <#T##CGPoint#>, toPoint: <#T##CGPoint#>)
  • 吸附行为
    吸附行为好像是一个棍子将两个物体连接在一起,两个物体间的距离是刚性的。

UIAttachmentBehavior的length属性表示两个物体之间的距离,单位是

let attachment = UIAttachmentBehavior(item:  , attachedToAnchor:  )
  • 推行为 UIPushBehavior 可以使视图对象朝着某个方向运动,这个推力有瞬间(UIPushBehaviorModeInstantaneous) 和 持续(UIPushBehaviorModeContinuous
let push = UIPushBehavior(items: [myView], mode: UIPushBehaviorMode.Continuous)
//需要考虑到方向和大小,因为力是矢量
//创建矢量(结构体类型)
let pushDirection :CGVector = CGVectorMake(0.5, -0.5)
push.pushDirection = pushDirection
//设置力度:默认为1.0
push.magnitude = 5.0
   
//或者用下面的方法代替
push.setAngle(CGFloat(-M_PI/4.0), magnitude: 5.0)
  • 甩行为 UISnapBehavior

使物体向某个点甩出或抛出, 并且有瞬间加速度,由慢到快,再由快到慢。最后停止在目标点。

var snap = UISnapBehavior(item: myView, snapToPoint: point)

UIDynamicItemBehavior 用来设置力学行为的参数。这些参数包括弹性系数、摩擦系数、阻力和密度等。

(1) density:密度。如果100x100点的物体,它的密度是1.0,作用力是1.0,那么它的加速度就是100点/s²

(2) elasticity:弹性系数。范围是0.0~1.0,0表示没有反弹,1.0表示完全弹性碰撞。

(3) friction:摩擦系数。 0表示没有摩擦,1.0表示摩擦很强。如果要设置更强,可以取值>1.0

(4) resistance:阻力,物体运动时在线性方向的阻力。0.0是没有阻力,CGFloat_MAX表示最大阻力

(5) allowsRotation.是否允许旋转

(6) angularResistance角阻力,物体旋转时旋转方向的阻力。

示例:

var itemBehaviour  = UIDynamicItemBehavior(items: [myView])
itemBehaviour.elasticity = 0.5
itemBehaviour.allowsRotation = true
itemBehaviour.friction = 0.0
itemBehaviour.resistance = 0.0
animator.addBehavior(itemBehaviour)