@zhangyuhangk
2015-08-01T09:47:25.000000Z
字数 3778
阅读 2220
iOS
UIDynamic
iOS7引入了UIDynamic框架,大大简化了物理引擎的使用。UIDynamic里包含3种对象:
具体用法大致如下:
基本原理应该是这样的(个人理解):
主要属性和方法:
addBehavior:
: 添加behaviordelegate
: 委托重力效果。
以下代码在屏幕上放置一个小方块,然后在重力下让它往下掉。
lazy var blueView: UIView = {
let view = UIView()
view.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
view.center = self.view.center
view.backgroundColor = UIColor.blueColor()
self.view.addSubview(view)
return view
}()
lazy var animator: UIDynamicAnimator = {
let animator = UIDynamicAnimator(referenceView: self.view)
return animator
}()
lazy var gravity: UIGravityBehavior = {
let gravity = UIGravityBehavior()
self.animator.addBehavior(gravity)
return gravity
}()
lazy var collision: UICollisionBehavior = {
let collision = UICollisionBehavior()
collision.translatesReferenceBoundsIntoBoundary = true
self.animator.addBehavior(collision)
return collision
}()
func testGravity() {
gravity.addItem(blueView)
}
override func viewDidLoad() {
super.viewDidLoad()
testGravity()
}
UIGravityBehavior基本属性:
gravityDirection
: 重力向量。包含重力方向和大小。默认值为CGVector(dx: 0, dy: 1)angle
: gravityDirection的方向。向正右时孤度为0。magnitude
: gravityDirection的大小。默认为1。
func panToApplyGravity(gesture: UIPanGestureRecognizer) {
let direction = gesture.translationInView(view)
gravity.gravityDirection = CGVector(dx: direction.x, dy: direction.y)
gravity.magnitude = 1
}
碰撞效果。
上面例子里的方块会掉出屏幕,是因为没有东西拦住它。这里添加上碰撞效果,并且把view的bounds设为边界,它就不会跑出去了。
lazy var collision: UICollisionBehavior = {
let collision = UICollisionBehavior()
collision.translatesReferenceBoundsIntoBoundary = true
self.animator.addBehavior(collision)
return collision
}()
func testCollision() {
gravity.addItem(blueView)
collision.addItem(blueView)
}
UICollisionBehavior主要属性和方法:
translatesReferenceBoundsIntoBoundary
: 默认为false,设为true时animator的referenceView(也就是创建animator时传进去的view)的bounds就变成边框,物体可以碰撞到它,但无法穿过,它也不会移动。setTranslatesReferenceBoundsIntoBoundaryWithInsets
: 设置边界的内边距addBoundaryWithIdentifier:forPath:
函数: 可以添加做生意形状和数量的边框。collisionDelegate
: 委托附着效果,使两个点保持固定距离。有两种模式:
主要属性和方法:
attachedBehaviorType
: 模式init
: 有4种构造函数,很好懂捕捉效果,类似于用一根弹簧将物体和一个点绑住。主要属性和方法:
init(item: UIDynamicItem, snapToPoint point: CGPoint)
: 构造函数。不同于其它behavior,UISnapBehavior不能调用无参构造函数(但是又可以通过编译……运行会抛异常)snapPoint
: 绑定的点damping
: 震荡系数,取值0~1,控制弹簧效果。经个人测试,有如下特性:
施加力量效果。可以是持续的(类似重力)或瞬间的。
主要属性:pushDirection
,angle
,magnitude
,都一目了然,不用说了。
用于设置物理属性。这个比较通用,可以对物体直接速度或摩擦系数等等。主要属性和方法:
addAngularVelocity:forItem:
: 添加角速度。
lazy var stickView: UIView = {
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
view.backgroundColor = UIColor.greenColor()
self.view.addSubview(view)
return view
}()
func testAngularVelocity() {
stickView.center = view.center
let itemBehavior = UIDynamicItemBehavior(items: [stickView])
itemBehavior.addAngularVelocity(5, forItem: stickView)
animator.addBehavior(itemBehavior)
}
addLinearVelocity:forItem:
: 添加线性速度。allowsRotation
: 是否允许旋转。默认为true。注意: 设为false,碰撞的时候不会旋转,但调用addAngularVelocity:forItem:的话,依然会旋转。angularResistance
: 角阻力。在上面“旋转的棍子”代码里加一行itemBehavior.angularResistance = 1,可以使旋转逐渐停止。density
: 密度。影响质量。elasticity
: 弹性。取值0~1。friction
: 摩擦力。物体相接触时才会生效。resistance
: 线性阻力。全局生效。