iOS7新特征汇总[05]初窥UIKit动力(UIKit Dynamics)


此图来此WWDC视频

小引

通过之前的4篇文章,笔者把iOS7中的涉及到的一些新特征做了一个简单的介绍。本文将带领大家初窥新特征里面的一个topic:UIKit动力(UIKit Dynamics)。

注1:关于UIKit Dynamics的中文名称:我在这里叫做UIKit动力,也有人叫UIKit动力模型和UIKit动态,总感觉怪怪的——所以大家在看到的时候不要在意即可。
注2:今天有开发者提起iOS7 beta还处于苹果的NDA(Non-Disclosure Agreement)状态,也就是说目前关于iOS7 beta的任何内容除了官方公开发表的信息外,作为开发者最多只能在苹果的开发者论坛上进行讨论交流,禁止在公开场合谈论关于iOS7 beta的信息。关于NDA感觉国外的意识比较好,就跟版权意识一样。由此笔者也在这里友情提醒一下:读者单纯的看本系列文章即可,在iOS7 release之前,保持沉默状态
注3:本文在写作的时候参考了如下一些内容(具体内容请登录苹果开发者网站查阅):

  1. WWDC 2013 session 206 — Getting Started with UIKit Dynamics
  2. UIDynamicAnimator Class Reference
  3. UIDynamicAnimatorDelegate Protocol Reference
  4. UIDynamicBehavior Class Reference
  5. UIDynamicItem Protocol Reference
  6. UIDynamicItemBehavior Class Reference
  7. UIKit Dynamics Catalog(Sample Code)

UIKit动力简介

什么是UIKit动力?—— 一句话:UIKit动力提供了一个模拟真实世界中力学相关的动画和交互系统。比如重力、碰撞和吸附等。UIKit动力具有可组合、可重用和声明式的特点。

在程序中利用UIKit提供的接口来实现力学行为,可以减少80%的代码量。

 

UIKit动力架构

如上图所示,UIKit动力系统中,涉及到如下4个内容:

UIDynamicAnimator:UIDynamicAnimator介于iOS图形引擎和动力项(View)之间, 具有如下功效

  • 提供动力行为的上下文
  • 根据ref view确定坐标系
  • 控制动力引擎
  • 维护着动力行为的状态

UIDynamicAnimatorDelegate是与UIDynamicAnimator相关的一个delegate。主要用于动力行为被启动或者暂定时,做出的回应。也就是说,在动力行为运行期间,有两个事件(启动和暂定)可供我们使用。

UIDynamicBehavior:主要用来描述动力的行为。在iOS7中,默认提供了如下动力行为:

  • UIAttachmentBehavior
  • UICollisionBehavior
  • UIDynamicItemBehavior
  • UIGravityBehavior
  • UIPushBehavior
  • UISnapBehavior objects

动力行为可以在任意时间内进行添加或移除。另外动力行为可以是组合的,也可以被继承。

注意:这些动力行为是在二维空间进行的。

Reference View:该用是用来初始化Animator用的,它的作用是给动力行为提供坐标系。

View:在UIKit动力中,又称为动力项(dynamic item)。动力项是遵循UIDynamicItem协议的任意对象(可以是SDK中默认提供的,或者开发者自定义的)。在iOS7 beta中,View已经遵循了该协议,所以一般也会将View当做动力项——动力行为实际针对的对象。

代码示例

下面笔者就通过一个例子,演示如何对一个view施加重力行为(UIGravityBehavior)。

上面介绍了一大堆,实际使用过程可能没那么复杂,不过原理才是最重要的。

新建一个Single View Application模板工程:BVGravityBehavior,在工程中,有如下属性:

  
  
  
  
  1. @property (nonatomic, weak) IBOutlet UIImageView *square1;
  2. @property (nonatomic) UIDynamicAnimator* animator;

另外还有两个方法:

  
  
  
  
  1. // 开始重力行为
  2. - (IBAction)startGravity:(id)sender
  3. {
  4. self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
  5. UIGravityBehavior* gravityBeahvior = [[UIGravityBehavior alloc] initWithItems:@[self.square1]];
  6. [self.animator addBehavior:gravityBeahvior];
  7. }
  
  
  
  
  1. // 停止重力行为
  2. - (IBAction)stopGravity:(id)sender
  3. {
  4. [self.animator removeAllBehaviors];
  5. }

运行程序,效果如下(如图没看到gif动画效果,点击下图,在新窗口中可以看到效果):

 

也可以停止当前的动力行为:在重力行为运行过程中,如果点击停止,就可以停止重力行为,view的状态为停止前的状态。

 

代码下载

 

小结

本文对UIKit动力做了一个入门级别的介绍,并给出了一个小示例,演示了如何给view添加一个重力行为。在下一篇文章中,笔者将继续介绍UIKit动力。


转自 破船之家

你可能感兴趣的:(ios,ios7,UIKit)