iOS开发拓展篇—UIDynamic(简单介绍)

阅读更多

 

 

一、简单介绍

 

1.什么是UIDynamic

 

UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架

 

可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象

 

如:重力、弹性碰撞等现象

 

 

 

2.物理引擎的价值

 

广泛用于游戏开发,经典成功案例是愤怒的小鸟

 

让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果

 

提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏

 

 

 

3.知名的2D物理引擎

 

Box2d

 

Chipmunk

 

 

 

二、使用步骤

 

要想使用UIDynamic来实现物理仿真效果,大致的步骤如下

 

1)创建一个物理仿真器(顺便设置仿真范围)

 

2)创建相应的物理仿真行为(顺便添加物理仿真元素)

 

3)将物理仿真行为添加到物理仿真器中开始仿真

 

 

 

三、相关说明

 

1.三个概念

 

1)谁要进行物理仿真?

 

  物理仿真元素(Dynamic Item

 

 

 

2)执行怎样的物理仿真效果?怎样的动画效果?

 

  物理仿真行为(Dynamic Behavior

 

 

 

3)让物理仿真元素执行具体的物理仿真行为

 

  物理仿真器(Dynamic Animator

 

 

 

2.物理仿真元素

 

注意:

 

不是任何对象都能做物理仿真元素

 

不是任何对象都能进行物理仿真

 

 

 

物理仿真元素要素:

 

任何遵守了UIDynamicItem协议的对象

 

UIView默认已经遵守了UIDynamicItem协议,因此任何UI控件都能做物理仿真

 

UICollectionViewLayoutAttributes类默认也遵守UIDynamicItem协议

 

 

 

3.物理仿真行为

 

1UIDynamic提供了以下几种物理仿真行为

 

UIGravityBehavior:重力行为

 

UICollisionBehavior:碰撞行为

 

UISnapBehavior:捕捉行为

 

UIPushBehavior:推动行为

 

UIAttachmentBehavior:附着行为

 

UIDynamicItemBehavior:动力元素行为

 

 

 

2)物理仿真行为须知

 

上述所有物理仿真行为都继承自UIDynamicBehavior

 

所有的UIDynamicBehavior都可以独立进行

 

组合使用多种行为时,可以实现一些比较复杂的效果

 

 

 

 

 

4.物理仿真器

 

1)物理仿真器须知

 

它可以让物理仿真元素执行物理仿真行为

 

它是UIDynamicAnimator类型的对象

 

 

 

2UIDynamicAnimator的初始化

 

- (instancetype)initWithReferenceView:(UIView *)view;

 

view参数:是一个参照视图,表示物理仿真的范围

 

 

 

5.物理仿真器的说明

 

1UIDynamicAnimator的常见方法

 

  - (void)addBehavior:(UIDynamicBehavior *)behavior;    //添加1个物理仿真行为

 

  - (void)removeBehavior:(UIDynamicBehavior *)behavior;  //移除1个物理仿真行为

 

  - (void)removeAllBehaviors;    //移除之前添加过的所有物理仿真行为

 

 

 

2UIDynamicAnimator的常见属性

 

  @property (nonatomic, readonly) UIView* referenceView;  //参照视图

 

  @property (nonatomic, readonly, copy) NSArray* behaviors;//添加到物理仿真器中的所有物理仿真行为

 

  @property (nonatomic, readonly, getter = isRunning) BOOL running;//是否正在进行物理仿真

 

  @property (nonatomic, assign) id delegate;//代理对象(能监听物理仿真器的仿真过程,比如开始和结束)

 

如何使用swift写UIDynamic

import UIKit

class FirstViewController: UIViewController,UICollisionBehaviorDelegate {
    var animator = UIDynamicAnimator()
    var gravity = UIGravityBehavior()
    var collision = UICollisionBehavior()
    var firstContact = false

    override func viewDidLoad() {
        super.viewDidLoad()

        let square = UIView(frame: CGRectMake(100, 100, 100, 100))
        square.backgroundColor = UIColor.grayColor()
        view.addSubview(square)

        animator = UIDynamicAnimator(referenceView: view)
        gravity = UIGravityBehavior(items: [square])
        animator.addBehavior(gravity)

        let barrier = UIView(frame: CGRectMake(0, 300, 130, 20))
        barrier.backgroundColor = UIColor.redColor()
        view.addSubview(barrier)

        collision = UICollisionBehavior(items: [square])
        collision.translatesReferenceBoundsIntoBoundary = true
        animator.addBehavior(collision)

        //添加一个碰撞体
        let rightEdge = CGPointMake(barrier.frame.origin.x + barrier.frame.size.width, barrier.frame.origin.y)
        collision.addBoundaryWithIdentifier("barrier", fromPoint: barrier.frame.origin, toPoint: rightEdge)

        collision.action = {
            println("(NSStringFromCGAffineTransform(square.transform)),(NSStringFromCGPoint(square.center))") //只要动就会触发,可以获得动的物体的位置
        }
        collision.collisionDelegate = self

        let itemBehaviour = UIDynamicItemBehavior(items: [square])
        itemBehaviour.elasticity = 0.6 //更改弹性
        animator.addBehavior(itemBehaviour)
    }

    func collisionBehavior(behavior: UICollisionBehavior, beganContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying, atPoint p: CGPoint) {
        println("began contact") //碰撞时触发
        //每次碰撞都会变黄一下,然后又转成灰色
        let view = item as UIView
        view.backgroundColor = UIColor.yellowColor()
        UIView.animateWithDuration(0.3, animations: {
            view.backgroundColor = UIColor.grayColor()
        })

        //检测第一次碰撞,动态添加behaviors
        if !firstContact {
            firstContact = true
            //处理第一次碰撞的地方
        }

    }

 

你可能感兴趣的:(ios,扩展)