随手记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会被丢出去。
目录
相关文章
|
Java API Maven
Java工具篇之反射框架Reflections
Reflections通过扫描classpath,索引元数据,并且允许在运行时查询这些元数据。 使用Reflections可以很轻松的获取以下元数据信息: - [x] 获取某个类型的全部子类 - [x] 只要类型、构造器、方法,字段上带有特定注解,便能获取带有这个注解的全部信息(类型、构造器、方法,字段) - [x] 获取所有能匹配某个正则表达式的资源 - [x] 获取所有带有特定签名的方法,包括参数,参数注解,返回类型 - [x] 获取所有方法的名字 - [x] 获取代码里所有字段、方法名、构造器的使用权
1654 0
|
11月前
|
监控 前端开发 安全
在Linux中,假如公司网站访问速度变的很慢很慢,该如何处理?
在Linux中,假如公司网站访问速度变的很慢很慢,该如何处理?
|
7月前
|
供应链 物联网 区块链
新技术浪潮下的变革:区块链、物联网与虚拟现实的融合与创新####
【10月更文挑战第21天】 本文深入剖析了当下三大前沿技术——区块链、物联网(IoT)与虚拟现实(VR)的最新发展趋势,并探讨了它们各自在实际应用中的突破性进展与交叉融合的创新潜力,特别是在提升数据安全、优化用户体验及推动行业数字化转型方面的贡献。通过实例分析,本文揭示了这些技术如何单独及协同作用,重塑传统行业格局,促进数字经济与实体经济深度融合,开启智能化、透明化与沉浸式体验的新纪元。 ####
312 27
|
敏捷开发 算法 测试技术
【软件设计师—基础精讲笔记5】第五章 软件工程基础
【软件设计师—基础精讲笔记5】第五章 软件工程基础
159 2
串口通讯工具minicom-在银河麒麟操作系统下的使用
在银河麒麟OS中调试神州数码网络设备,如CS6200交换机,使用`minicom`工具。连接CONSOLE线,打开终端,用`sudo minicom -s`进入配置。设置串口为`ttyUSB0`(用`ls /dev`查找),波特率设为115200。保存配置后,开始设备配置。
串口通讯工具minicom-在银河麒麟操作系统下的使用
|
11月前
|
存储 Go Python
[golang]使用gopsutil获取系统信息
[golang]使用gopsutil获取系统信息
282 0
|
12月前
|
SQL 监控 Java
IDEA插件-Mybatis Log Free日志替换
MyBatis Log Free 是一个免费的用于在 IntelliJ IDEA 中显示 MyBatis 日志的插件。它可以帮助您更方便地查看和分析 MyBatis 的 SQL 执行情况,以及定位潜在的性能问题,提高开发效率。
1085 0
IDEA插件-Mybatis Log Free日志替换
|
机器学习/深度学习 人工智能 算法
AI技术在医疗影像诊断中的革命性应用
医疗影像诊断是医学领域中至关重要的一环,而人工智能技术的迅猛发展为医疗影像诊断带来了革命性的变革。本文将探讨人工智能在医疗影像领域的应用,以及其对医学诊断精准性、效率和成本的影响。
真正解决办法:编译freeswitch错误,You must install libavformat-dev to build mod_av
真正解决办法:编译freeswitch错误,You must install libavformat-dev to build mod_av
483 1
|
机器学习/深度学习 数据挖掘 PyTorch
PyTorch深度学习实战 | 预测工资——线性回归
通过员工工作年限与工资的对应关系表,找出二者之间的关系,并预测在指定的年限时,工资会有多少。
1221 0
PyTorch深度学习实战 | 预测工资——线性回归
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问