@zhangyuhangk
2015-08-01T09:47:25.000000Z
字数 3778
阅读 2340
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.centerview.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 = trueself.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 = trueself.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.centerlet 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: 线性阻力。全局生效。