[关闭]
@zhangyuhangk 2015-08-01T09:47:25.000000Z 字数 3778 阅读 2220

UIDynamic学习笔记

iOS UIDynamic


基本概念

iOS7引入了UIDynamic框架,大大简化了物理引擎的使用。UIDynamic里包含3种对象:

具体用法大致如下:

  1. 创建一个UIDynamicAnimator
  2. 创建一些UIDynamicBehavior,把一些UIView加到里面(调用addItem:)
  3. 把behavior对象加到animator(调用addItem:)
  4. 大功告成,简单到另人发指。

基本原理应该是这样的(个人理解):

  1. 创建UIDynamicAnimator时,animator会在内部调用物理引擎,创建物理环境,并以构造函数传入的view作为参照坐标系。
  2. animator再将自己添加到main run loop,以确保自己的『帧函数』(以下简称step函数)会在每帧开始处被调用。而step函数的内容就是调用其内的每个behavior的step
  3. 每个behavior在step函数内更新每个item的状态

UIDynamicAnimator

主要属性和方法:

UIGravityBehavior

重力效果。
以下代码在屏幕上放置一个小方块,然后在重力下让它往下掉。

  1. lazy var blueView: UIView = {
  2. let view = UIView()
  3. view.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
  4. view.center = self.view.center
  5. view.backgroundColor = UIColor.blueColor()
  6. self.view.addSubview(view)
  7. return view
  8. }()
  9. lazy var animator: UIDynamicAnimator = {
  10. let animator = UIDynamicAnimator(referenceView: self.view)
  11. return animator
  12. }()
  13. lazy var gravity: UIGravityBehavior = {
  14. let gravity = UIGravityBehavior()
  15. self.animator.addBehavior(gravity)
  16. return gravity
  17. }()
  18. lazy var collision: UICollisionBehavior = {
  19. let collision = UICollisionBehavior()
  20. collision.translatesReferenceBoundsIntoBoundary = true
  21. self.animator.addBehavior(collision)
  22. return collision
  23. }()
  24. func testGravity() {
  25. gravity.addItem(blueView)
  26. }
  27. override func viewDidLoad() {
  28. super.viewDidLoad()
  29. testGravity()
  30. }

UIGravityBehavior基本属性:

  1. func panToApplyGravity(gesture: UIPanGestureRecognizer) {
  2. let direction = gesture.translationInView(view)
  3. gravity.gravityDirection = CGVector(dx: direction.x, dy: direction.y)
  4. gravity.magnitude = 1
  5. }

UICollisionBehavior

碰撞效果。
上面例子里的方块会掉出屏幕,是因为没有东西拦住它。这里添加上碰撞效果,并且把view的bounds设为边界,它就不会跑出去了。

  1. lazy var collision: UICollisionBehavior = {
  2. let collision = UICollisionBehavior()
  3. collision.translatesReferenceBoundsIntoBoundary = true
  4. self.animator.addBehavior(collision)
  5. return collision
  6. }()
  7. func testCollision() {
  8. gravity.addItem(blueView)
  9. collision.addItem(blueView)
  10. }

UICollisionBehavior主要属性和方法:

UIAttachmentBehavior

附着效果,使两个点保持固定距离。有两种模式:

  1. 使两个物体的中心点(可设置偏移)保持固定距离
  2. 使一个物体的中心点(可设置偏移)和一个指定点保持固定距离

主要属性和方法:

UISnapBehavior

捕捉效果,类似于用一根弹簧将物体和一个点绑住。主要属性和方法:

经个人测试,有如下特性:

UIPushBehavior

施加力量效果。可以是持续的(类似重力)或瞬间的。
主要属性:pushDirectionanglemagnitude,都一目了然,不用说了。

UIDynamicItemBehavior

用于设置物理属性。这个比较通用,可以对物体直接速度或摩擦系数等等。主要属性和方法:

  1. lazy var stickView: UIView = {
  2. let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 20))
  3. view.backgroundColor = UIColor.greenColor()
  4. self.view.addSubview(view)
  5. return view
  6. }()
  7. func testAngularVelocity() {
  8. stickView.center = view.center
  9. let itemBehavior = UIDynamicItemBehavior(items: [stickView])
  10. itemBehavior.addAngularVelocity(5, forItem: stickView)
  11. animator.addBehavior(itemBehavior)
  12. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注