欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-17 21:22:27
...

 

 

一、简单介绍

 

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 <UIDynamicAnimatorDelegate> 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 扩展