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

本文转载自:破船之家

本文地址:iOS7新特征汇总[05]初窥UIKit动力(UIKit Dynamics)

QQ20130615-6 QQ20130615-6

此图来此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动力简介

QQ20130615-5QQ20130615-5

codecode

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

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

 

UIKit动力架构

QQ20130616-8QQ20130616-8

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

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

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

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

QQ20130616-10QQ20130616-10UIDynamicBehavior:主要用来描述动力的行为。在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,在工程中,有如下属性:

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

另外还有两个方法:

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

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

11

 

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

22

 

代码下载

代码下载代码下载


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值