随手记UIKit Dynamics

趁着今年WWDC的开展,我又回顾了下去年的一些内容,发现有些新特性博客上都没有记录,想想iOS 8都出来了,iOS 7的特性再不随手记录下都晚了 :)

参考WWDC 2013的Session Videos《Getting Started with UIKit Dynamics》和《Advanced Techniques with UIKit Dynamics》,随手记了以下几点:

UIKit Dynamics是抽象出来封装好的二维物理引擎,并自定义了UIKit物理世界的两个常量,用UIKit重力加速度1000p/s2替换了地球重力加速度,用UIKit牛顿第二定律每一单位的力可以使得100p*100p的view产生100p/s2的加速度来替换1F = 1Kg * 1m/s2。

从使用者的角度来看,UIKit Dynamics有如下几个角色:

UIDynamicAnimator —— 封装了底下的物理引擎,使得我们可以方便地添加物理行为;

UIDynamicBehavior —— 定义了物理行为的类型;

UIDynamicItem      —— 参与物理动画的对象;

借用两张网上的照片来描述三者之间的关系,分别来自http://www.teehanlax.com/blog/introduction-to-uikit-dynamics/ 和 WWDC 2013。

下面是具体的demo代码。首先我们创建UIDynamicAnimator:

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

使用self.view作为参考系。

接着,创建要作用物理动画的视图对象,不妨为一个label:

    UILabel *label = [[UILabel alloc] initWithFrame:(CGRect){100, 100, 100, 40}];
    label.backgroundColor = [UIColor redColor];
    [self.view addSubview:label];

于是我们可以在label上添加重力加速度和碰撞的物理效果:

    UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[label]];
    [self.animator addBehavior:gravityBehavior];

    UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[label]];
    collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
    [self.animator addBehavior:collisionBehavior];

这就能创建出十分生动的物理动画了。

除此之外,我们还可以在视图上加上作用力:

    self.pushBehavior = [[UIPushBehavior alloc] initWithItems:@[label] mode:UIPushBehaviorModeInstantaneous];
    self.pushBehavior.pushDirection = CGVectorMake(1.0f, 0);
    [self.animator addBehavior:self.pushBehavior];

这样,label就不是垂直往下掉了,而是有个水平作用力使得label撞向边缘。

为了使得动画更有趣,可以加点用户的交互:

    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didPanLabel:)];
    [label addGestureRecognizer:panGesture];

为label添加一个拖动手势,相当于作用于label上的力的来源:

#pragma mark - 

- (void)didPanLabel:(UIPanGestureRecognizer *)panGesture
{
    UIGestureRecognizerState state = panGesture.state;
    if (state == UIGestureRecognizerStateEnded) {
        CGPoint velocity = [panGesture velocityInView:self.view];
        self.pushBehavior.pushDirection = CGVectorMake(velocity.x / 1000, velocity.y / 1000);
        self.pushBehavior.active = YES;
    }
}

这样,当检测到用户施力作用在label之上时,label会被丢出去。

时间: 2024-10-29 13:39:51

随手记UIKit Dynamics的相关文章

WWDC 2013 Session笔记 - UIKit Dynamics入门

这是我的WWDC2013系列笔记中的一篇,完整的笔记列表请参看这篇总览.本文仅作为个人记录使用,也欢迎在许可协议范围内转载或使用,但是还烦请保留原文链接,谢谢您的理解合作.如果您觉得本站对您能有帮助,您可以使用RSS或邮件方式订阅本站,这样您将能在第一时间获取本站信息. 本文涉及到的WWDC2013 Session有 Session 206 Getting Started with UIKit Dynamics Session 221 Advanced Techniques with UIKit

UIKit 力学教程

建议点按下面的标题,跳至原文,以下转载的页面布局太垃圾! UIKit 力学教程  Colin Eberhardt on October 9, 2013 这篇文章还可以在这里找到 英语, 俄语, 韩语 Ray:这篇教程节选自 iOS 7 教程集,它是 iOS 7 盛宴的一部分,希望你能喜欢. 你可能已经注意到 iOS 7 中似乎有一些自相矛盾的地方,苹果在建议放弃真实世界的隐喻和拟物化同时,又鼓励创造体验真实的用户界面. 在实践中这意味着什么呢?iOS 7 的设计目标是鼓励创造能像真实的物理对象一

iOS UIKit 框架 346 篇文档分类整理 - 预告

iOS UIKit 框架 346 篇文档分类整理 - 预告 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 当前正在进行的是 "iOS Foundation 框架 224 篇相关文档分

Swift实现UIKit Dynamic动画

iOS7引入了UIKit Dynamics,可以帮助开发者开发出更接近真实世界的动画效果.之前,用户如果要做出这样的效果,需要话很多的时间在物理计算和Core Animation上.现在,所有的一切都变得非常简单,只要简单的几行就可以实现真实世界的效果.比如,重力.碰撞等. UI Dynamics中得类包括: UIGravityBehavior -给你的view添加重力效果. UICollisionBehavior -添加碰撞效果. UISnapBehavior -添加瞬间移位到某个位置,就好像

史上最全的iOS开源项目分类汇总

楼主转载的,并未亲自测试 Category/Util  sstoolkit 一套Category类型的库,附带很多自定义控件 功能不错-        BFKit 又一套Category类型的 Kit,还有几个工具类        APUtils 又一套Category类型的 Kit        QSKit 又一套Category类型的 Kit        iOS-Categories 又一套Category类型的 Kit        BlocksKit 将Block风格带入UIKit和F

WWDC 2013 Session笔记 - iOS7中的ViewController切换

这是我的WWDC2013系列笔记中的一篇,完整的笔记列表请参看这篇总览.本文仅作为个人记录使用,也欢迎在许可协议范围内转载或使用,但是还烦请保留原文链接,谢谢您的理解合作.如果您觉得本站对您能有帮助,您可以使用RSS或邮件方式订阅本站,这样您将能在第一时间获取本站信息. 本文涉及到的WWDC2013 Session有 Session 201 Building User Interfaces for iOS 7 Session 218 Custom Transitions Using View C

开发者所需要知道的iOS7 SDK新特性

春风又绿加州岸,物是人非又一年.WWDC 2013 keynote落下帷幕,新的iOS开发旅程也由此开启.在iOS7界面重大变革的背后,开发者们需要知道的又有哪些呢.同去年一样,我会先简单纵览地介绍iOS7中我个人认为开发者需要着重关注和学习的内容,之后再陆续对自己感兴趣章节进行探索.计划继承类似WWDC2012的笔记的形式,希望对国内开发者有所帮助. 相关笔记整理如下: 总览 开发者所需要知道的iOS7 SDK新特性 工具 WWDC2013笔记 Xcode5和ObjC新特性 UIKit动力学 

iOS 各版本中的新特性(What's New in iOS)- 目录翻译完成

iOS 各版本中的新特性(What's New in iOS) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 介绍 Introduction文档组织结构 Organization of Thi

[翻译] AsyncDisplayKit

AsyncDisplayKit AsyncDisplayKit is an iOS framework that keeps even the most complex user interfaces smooth and responsive. It was originally built to make Facebook's Paper possible, and goes hand-in-hand with pop's physics-based animations - but it'