UIDynamic(一)

UIDynamic(一)

前言

  • 最近看了一下UIDynamic,UIDynamic是13年WWDC出的技术。其实本人一直热衷于比较有趣的动画,特别是带物理力学的动画,感觉物理力学就是动画的灵魂,一直想找几个小伙伴把物理与动画结合起来,做一下类似于物理引擎的迷你版玩玩,但是由于可支配时间不多,以至于这个夙愿未能完成,但发现UIDynamic这套UIKit自带的物理引擎也挺好玩的,所以先玩几天把,好了,废话不多说,直入正题。

基础

  • 概念

    • UIDynamicItem:一个控件想要执行UIDynamicAnimator的动画就必须要继承这个协议。
    • UIDynamicAnimator:Animator为动态控件提供物理相关的力学和动画,也为这些动画提供了上下文,通过添加Behavier实例来实现想要的动画效果,在以下介绍到的物理力学里面一切动画的源头都是他,也可以说,UIKit的动力学最外层的包装就是它。
    • ReferenceView:在初始化UIDynamicAnimator的时候有一个叫做referenceView的属性,他是你的参考视图,你的子控件以及子控件的Beahavier就是参考这个视图的坐标的。
    • UIDynamicBehavior:它可以看做是把一种物理行为封装起来的一个类,一个Behavior实例可以赋予多个动态控件的一个物理行为。
  • 扩展
    • 一个动态控件可以是任何遵循UIDynamicItem协议的iOS或者自定义对象,UIView和UICollectionViewLayeroutAttributes类都实现了这个协议,你可以自定义遵循这个协议的的控件来使用这个物理动画。
  • 层次
    • UIDynamicBehavior苹果官方提供了六种物理行为的封装,换言之,苹果官方对外只提供了六种基本的物理行为,但你可以自定义符合的物理行为,不过你自定义的这个行为必须继承UIDynamicBehavior.其层次如下

UIDynamicBehavio层次图

应用场景

  • UIGravityBehavior:重力行为,来个自由落体
     self.animator = UIDynamicAnimator(referenceView: self.view)
        var gravity = nil
        gravity = UIGravityBehavior(items: [littleBall])
        self.animator.addBehavior(gravity)
  • 效果图如下
    由于本人用的是黑苹果,所以模拟器上会有些闪屏

我们还可以通过magnitude来设置重力加速度,值得一提的是,学过物理的同学应该知道这个吧,不过苹果这里面跟现实还是有些出入的,就像我们现实中g是9.8m/s²,而在UIKit中定义了g是1000 points / second²,换言之,如果一开始我们的速度为0,那么一秒后我们的速度是1000个点/秒

  • UICollisionBehavior:碰撞检测行为,是不是觉得感觉自由落体没有真实感,这个可以是我们的屏幕添加地面
       collision = nil
        collision = UICollisionBehavior(items: viewArr)
        collision.collisionDelegate = self
        collision.addBoundaryWithIdentifier("path", fromPoint: CGPointMake(0, self.view.frame.height), toPoint: CGPointMake(self.view.frame.width, self.view.frame.height))

注意:我们可以设置UICollisionBehavior的代理,来监听碰撞的行为,我们可以同translatesReferenceBoundsIntoBoundary这个属性来让我们的参考视图边界作为我们的墙壁,也可以通过这个addBoundaryWithIdentifier来设置我们的墙壁

  • UIDynamicItemBehavior:设置每个动态控件的自身属性,提供一下属性

    • elasticity:弹力
    • friction:摩擦力
    • density:密度
    • resistance:阻力
    • angularResistance:角阻力
    • allowsRotation:允许旋转
  • 我们暂且用这几个物理行为来做一个比较有趣的动画

这个的主要思路如下

  • 重力行为,碰转行为,属性行为
  • 定时器不断加小球,定时器可以选择NSTimer,CADisplayLink以及GCD,前两个不怎么准确,有时还会跳过任务,所以这里我选择了GCD定时器,NSTimer和CADisplayLink底层也是调用GCD定时器的。
  • 当小球消失在屏幕中回收内存,这里我是在碰撞代理方法里面回收,也可以用KVO监听来回收内存,但系统自带的KVO好像不好使,可以试一下Observable-Swift这个框架,里面很好的利用了Swift的泛型来实现的。
//        添加GCD定时器,比CADisplayLink和NSTimer更精确,受限制较小
        let queue:dispatch_queue_t = dispatch_get_main_queue()

        self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue)

        let start:dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64((UInt64(1.0) * NSEC_PER_SEC)))

        let interval:UInt64 = UInt64((UInt64(10.0) * NSEC_PER_SEC)/10)

        dispatch_source_set_timer(self.timer, start, interval, 0)
        dispatch_source_set_event_handler(self.timer, { () -> Void in
            self.addABall()
        })
        dispatch_resume(self.timer)
// addBall()方法里面
        let littleBall:LittleBall = LittleBall(frame: CGRectMake(self.view.center.x, CGFloat(arc4random_uniform(UInt32(100))) * -1, 20, 20))
        littleBall.backgroundColor = self.randomColor();
        littleBall.layer.cornerRadius = 10
        self.view.addSubview(littleBall)

        viewArr += [littleBall]

        gravity = nil
        gravity = UIGravityBehavior(items: viewArr)
        gravity.magnitude = 10

        collision = nil
        collision = UICollisionBehavior(items: viewArr)
        collision.collisionDelegate = self
        collision.addBoundaryWithIdentifier("path", fromPoint: CGPointMake(0, self.view.frame.height), toPoint: CGPointMake(self.view.frame.width, self.view.frame.height))

        itemBehavior = nil
        itemBehavior = UIDynamicItemBehavior(items: viewArr)
        itemBehavior.elasticity = 0.5

        self.animator.removeAllBehaviors()
        self.animator.addBehavior(gravity)
        self.animator.addBehavior(itemBehavior)
        self.animator.addBehavior(collision)
//在代理方法里面
        let view:UIView = item as! UIView

            if view.frame.origin.x < 0 || view.frame.origin.x > self.view.frame.width{
                let arr:NSMutableArray = NSMutableArray(array: self.viewArr)
                view.removeFromSuperview()
                arr.removeObject(view)
                self.viewArr = arr as [AnyObject]
            }
时间: 2024-11-05 14:40:58

UIDynamic(一)的相关文章

UIDynamic

简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 重力.弹性碰撞等现象 物理引擎的价值 广泛用于游戏开发,经典成功案例是“愤怒的小鸟” 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果 提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 知名的2D物理引擎 Box2d Chipmunk 使用步骤 要想使用UIDynamic来实现物理仿真效果,大致的步骤如下 创建一个物

iOS UIDynamic

1.简介 UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 重力.弹性碰撞等现象 UIView默认已经遵守了UIDynamicItem协议,因此任何UI控件都能做物理仿真,UICollectionViewLayoutAttributes类默认也遵守UIDynamicItem协议也能做物理仿真 物理引擎的价值 广泛用于游戏开发,经典成功案例是“愤怒的小鸟” 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真

iOS游戏开发之UIDynamic

iOS游戏开发之UIDynamic 简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象重力.弹性碰撞等现象 物理引擎的价值 广泛用于游戏开发,经典成功案例是“愤怒的小鸟” 让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果 提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 知名的2D物理引擎 Box2d Chipmunk 使用步骤 要想使用UIDynamic来实现物理仿

【iOS】UIDynamic

UIDynamic是从iOS 7开始引入的一种新技术,属于UIKit框架.可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象:如重力.弹性碰撞等现象. 一.UIDynamic中的一些概念 三个重要的类: UIDynamicItem Protocol:(要执行仿真动画的对象) To make a custom object eligible to participate in UIKit Dynamics, adopt the UIDynamicItem protocol in the ob

UIDynamic仿物理引擎-浮动碰撞效果-b

最近产品提了个需求(电商的APP-两鲜),需要在APP背景加上几个水果图案在那里无规则缓慢游荡...模仿 天天果园 APP的.好吧,那我就在网上找了很多文章,总结一下写个demo.效果如下: Mou icon 这里用到的是UIDynamic这个类. UIDynamic简介 一.简介 注意:UIKit动力学的引入,并不是为了替代CA或者UIView动画,在绝大多数情况下CA或者UIView动画仍然是最有方案,只有在需要引入逼真的交互设计的时候,才需要使用UIKit动力学它是作为现有交互设计和实现的

iOS进阶 - UIDynamic

一.简单概述 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 ,可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如:重力.弹性碰撞等现象 其实就是UIKit的一套动画和交互体系.我们现在进行UI动画基本都是使用CoreAnimation或者UIView animations.而UIKit动力学最大的特点是将现实世界动力驱动的动画引入了UIKit,比如重力,铰链连接,碰撞,悬挂等效果.总之就是,将2D物理引擎引入了人UIKit.需

UIDynamic 基础认识

UIDynamic 是从iOS 7开始引入的一种新技术,属于UIKit框架,可以模拟现实生活中的物理现象,如:碰撞.抖动.摆动等 动力效果:有一个效果器,叫做“动力效果器”里面面可以添加“动力效果” 动力效果:可以将上一个效果移除 动力效果:可以叠加多个效果 ------------------------------------------ 使用UIDynamic 基本步骤: 1.创建一个动力效果器(UIDynamicAnimator) 2.创建动力效果(Behavior)添加到对应的视图上

iOS开发拓展篇—UIDynamic(捕捉行为)

iOS开发拓展篇—UIDynamic(捕捉行为) 一.简介 可以让物体迅速冲到某个位置(捕捉位置),捕捉到位置之后会带有一定的震动 UISnapBehavior的初始化 - (instancetype)initWithItem:(id <UIDynamicItem>)item snapToPoint:(CGPoint)point; UISnapBehavior常见属性 @property (nonatomic, assign) CGFloat damping; 用于减幅.减震(取值范围是0.0

iOS开发——高级篇——UIDynamic 物理引擎

一.UIDynamic 1.简介什么是UIDynamicUIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象重力.弹性碰撞等现象 物理引擎的价值广泛用于游戏开发,经典成功案例是“愤怒的小鸟”让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 知名的2D物理引擎Box2dChipmunk 2.使用步骤要想使用UIDynamic来实现物理仿真效果,大致的步骤如下

IOS开发-UIDynamic(物理仿真)简单使用

UIDynamic是从IOS7开始引入的一种新技术,隶属于UIKit框架,我们可以认为是一种物理引擎能模拟和仿真现实生活中的物理现象,比如重力,弹性碰撞等. 可以让开发人员远离物理公式的情况下,实现一些物理仿真效果. 这里简单介绍一下重力,碰撞,捕捉的用法. 先介绍一下使用的大致步骤 创建物理仿真器 创建相应的物理仿真行为 将物理仿真行为添加到物理仿真器 一,重力与碰撞 提前在StoryBoard准备两个UIView,一个红色,一个蓝色.蓝色在红色的下方,保证红色下落能碰到蓝色的view. 1