iOS UIKit Dynamics(物理碰撞,动画)
早期技术文章搬家,原文链接
大部分人或许觉得动画用UIView 或是CoreAnimation的动画效果,那为何还需要UIKit 中的UIDynamic?
答:UIDynamic 为使用者提供更符合现实效果的互动行为(比如:自由落体能量消耗的过程)
一、需求:请实现下图所示的动画效果(物理碰撞)
二、上面引入过UIDynamic 可以实现碰撞的物理效果动画,how to start ?
- 在工程中导入UIKit,从Headers 找一些UIDynamic,发现了
UIDynamicAnimator.h
,UIDynamicBehavior
,UIDynamicItemBehavior
- 既然是要动画效果 那就应该是
UIDynamicAnimator.h
- 到
UIDynamicAnimator.h
头文件去查看注释
// When you initialize a dynamic animator with this method, you should only associates views with your behaviors.
// the behaviors (and their dynamic items) that you add to the animator employ the reference view’s coordinate system.
- (instancetype)initWithReferenceView:(UIView *)view NS_DESIGNATED_INITIALIZER;
- 大概意思是使用这个初始化方法的时候,需要为你的试图关联behaviors
- what’s the
behaviors
? jump into defination 然而还不是很懂,UIDynamicBehavior
,那就查看API (注意文档中的如下描述
)。 - This parent class, UIDynamicBehavior, is inherited by the primitive dynamic behavior classes UIAttachmentBehavior, UICollisionBehavior, UIGravityBehavior, UIDynamicItemBehavior, UIPushBehavior, and UISnapBehavior.
- 文档中提到UIDynamicBehavior的父类,那么
UIDynamicBehavior
父类(Dynamic 行为相关类)描述什么行为呢?- UIAttachmentBehavior:附着行为
- UICollisionBehavior:碰撞行为
- UIGravityBehavior:重力行为
- UIDynamicItemBehavior:动态元素行为
- UIPushBehavior:推行为
- UISnapBehavior:吸附行为
- 上述的各种行为可单独使用,也可以组合使用更复杂的动画效果。
解决方案的思路就引导到这边,也就可以实现上述需求。Dynamic 行为相关类的属性可自行研究。
三、解决方案。
- 上述需求的解决方案(我这边用的是6sP的模拟器奥,因为在设置floor的y坐标是600)
- 既然是球落地效果,必然有两个模拟对象:floor,basketBall
1.创建UIDynamicAnimator 对象
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
2.刚刚在API 看到了初始化UIDynamicAnimator需要关联一个或者多个行为
NSArray *animatorObjects = @[self.imageV1];// 刚刚在API 看到了初始化UIDynamicAnimator需要关联一个或者多个行为self.gravityBehav = [[UIGravityBehavior alloc] initWithItems:animatorObjects];self.colision = [[UICollisionBehavior alloc] initWithItems:animatorObjects];```- 3.如果你想监听碰撞的状态,可以设置一下代理```self.colision.collisionDelegate = self;```- 4.设置碰撞边界```
[self.colision addBoundaryWithIdentifier:@"boundaryLine" fromPoint:CGPointMake(0, 600) toPoint:CGPointMake(SCREENWITH, 600)];```- 5.设置动态行为参数```
// 设置动态行为参数UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:animatorObjects];// 设置弹性[itemBehavior setElasticity:0.5];```- 6.行为创建了,别忘了给animator添加上```
[self.animator addBehavior:self.gravityBehav];[self.animator addBehavior:self.colision];[self.animator addBehavior:itemBehavior];
三、下面代码只能说功能实现
- PS:以下代码不符合代码书写规范
//
// ViewController.m
// DynamicAnimation
//
// Created by JeversonJee on 16/5/27.
// Copyright © 2016年 JeversonJee. All rights reserved.
//#import "ViewController.h"#define SCREENWITH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height@interface ViewController ()<UICollisionBehaviorDelegate>@property (nonatomic, strong) UIDynamicAnimator *animator;
@property (nonatomic, strong) UIGravityBehavior *gravityBehav;
@property (nonatomic, strong) UICollisionBehavior *colision;@property (nonatomic, strong) UIImageView *imageV1;
@property (nonatomic, strong) UIImageView *imageV2;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.[self jjCollisionBehav];
}- (void)jjCollisionBehav {// 创建碰撞需要的对象[self jjCreateBall];[self jjCreateFloor];// 创建UIDynamicAnimator 对象self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];NSArray *animatorObjects = @[self.imageV1];// 刚刚在API 看到了初始化UIDynamicAnimator需要关联一个或者多个行为self.gravityBehav = [[UIGravityBehavior alloc] initWithItems:animatorObjects];self.colision = [[UICollisionBehavior alloc] initWithItems:animatorObjects];// 这里设置代理是为了监听碰撞状态的,可以去了解一下代理方法self.colision.collisionDelegate = self;// 设置碰撞边界[self.colision addBoundaryWithIdentifier:@"boundaryLine" fromPoint:CGPointMake(0, 600) toPoint:CGPointMake(SCREENWITH, 600)];// 设置动态行为参数UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:animatorObjects];// 设置弹性[itemBehavior setElasticity:0.5];// 创建了行为需要animator添加[self.animator addBehavior:self.gravityBehav];[self.animator addBehavior:self.colision];[self.animator addBehavior:itemBehavior];}-(void)collisionBehavior:(UICollisionBehavior *)behavior endedContactForItem:(id<UIDynamicItem>)item withBoundaryIdentifier:(id<NSCopying>)identifier {NSLog(@"collisionBehavior=%@", item);NSString *identifierStr = [NSString stringWithFormat:@"%@", identifier];NSLog(@"s=%@", identifier);if ( [identifierStr isEqualToString:@"boundaryLine"] ) {[self.imageV2 setBackgroundColor:[UIColor grayColor]];[UIView animateWithDuration:2 animations:^(void){[self.imageV2 setBackgroundColor:[UIColor grayColor]];}];}}-(void)jjCreateBall {_imageV1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"basketBall"]];_imageV1.frame = CGRectMake(100, 100, 60, 60);[self.view addSubview:_imageV1];
}- (void)jjCreateFloor {_imageV2 = [[UIImageView alloc] init];[_imageV2 setBackgroundColor:[UIColor grayColor]];_imageV2.frame = CGRectMake(0, 600, SCREENWITH, SCREENHEIGHT - 400);[self.view addSubview:_imageV2];
}-(void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end
The last but not least:
1.如果想更好的玩转UIDynamics请查阅fancypixel有关Playing With UIDynamics in iOS 9
PS:1.录屏 Gif (for Mac)软件:GIPHY CAPTURE
2.那个boundary(边界)设置的适合下面的floor是一样高的,我选的图片是有白色背景的方形(Rect),没有把背景改成透明的,会感觉到球的底面没有和floor 重合的感觉。
iOS UIKit Dynamics(物理碰撞,动画)相关推荐
- iOS UIKit:viewController之动画(5)
当弹出一个view controller时,UIKit提供了一些标准转换动画,并且也支持用户自定义的动画效果. 1 UIView动画 UIView是自带动画实现功能,其中有两种方式实现: ...
- IOS碰撞动画(降落动画)
// // Created by dkb on 15/9/27. // Copyright © 2015年 dkb. All rights reserved. // // OC 实现 #impor ...
- UIKit Dynamics入门
看E问文章时,发现了Dynamics,uikit动力,找了不错的入门文章. From:http://blog.csdn.net/baecheung/article/details/11911061 本 ...
- 【IOS开发进阶系列】动画专题
1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hello_Hwc/archive/123447.html 1.1 基本概念 1.1.1 CA ...
- iOS7新特征汇总[05]初窥UIKit动力(UIKit Dynamics)
本文转载自:破船之家 本文地址:iOS7新特征汇总[05]初窥UIKit动力(UIKit Dynamics) QQ20130615-6 此图来此WWDC视频 小引 通过之前的4篇文章,笔者把iOS7中 ...
- iOS UIKit框架注解
本文来自简书,原文地址:http://www.jianshu.com/p/e5b995ecf44d 导语 我们追求技术的提升,关注技术的发展历程:作为从事技术工作的伐码猿,有个想法(仅是个人想法),这 ...
- iOS7—Day by day—Day0:UIKit Dynamics
这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点 伴随着介绍苹果的iOS7,将会使你清晰的认清设备和现实世界的相互作用,UIKit Dynamics就是众多新 ...
- iOS7 UIKit Dynamics 的初步研究
这回开始学习iOS7新的UIKit Dynamics,我看有人翻译成UIKit 力学,我觉得倒挺贴切的,所以就借来用一用. 这个UIKit力学系统里要设计到四个东西: 1.UIDynamicAnima ...
- IOS项目之弹出动画二
在IOS项目之弹出动画一中只是实现也功能,并没有体现面向对象的思想 ,今天就试着把它封装了一下,弹出视图的内容可以根据自定义,此处只是用UIDatePicker来演示 我把它传到了GitHub上 ...
最新文章
- 想详细了解风头正劲的联邦学习吗?这篇最强综述论文满足你
- 关于使用asp.net调试器出现的问题及相关解决方法
- VTK:可视化之ShadowsLightsDemo
- MySQL中索引的分类和基本操作
- Java Web乱码分析及解决方案
- c#设计模式-建造者模式
- combox 增加请选择_本命佛怎么请?
- java教学楼的属性_java设计一个父类建筑物building,由它派生出教学楼类classroom,然后采用一些数据进行测试....
- windows证书地址
- 【MyBatis笔记】05-传统开发模式DAO
- 数据库的点数据根据行政区shp来进行行政区处理,python定时器实现
- 【雷达通信】基于matlab CDIF算法雷达信号分选【含Matlab源码 1186期】
- 四、ip classless与默认路由
- ios备忘录下载安卓版_ios8备忘录app软件下载
- linux下ftp客户端主动模式设置
- 下载测试视频网站分享
- 称重仪表显示ol怎么解决_称重仪表显示Erd和数字是怎么回事?
- 服务器系统2008恢复,win2003升级为win2008、win2012保留数据重装恢复数据说明
- Fsm hdlc_HDLbits
- vue实现某一区域滚动,头部底部固定,中间滚动
热门文章
- 铺地砖问题 java
- ISIJ 2022收官,中国初中生再展风采
- SUM服务器监控软件全面介绍
- linux乱码,文件名乱码、文件内容乱码,JDK编码。 CKFinder文件名称乱码 (使用UTF-8解决)
- 记录爬取知识点中的图片
- 【SDN vs. NFV】纠缠不清的SDN和NFV
- 痞子衡嵌入式:浅谈i.MXRT1xxx系列MCU时钟相关功能引脚的作用
- python微博涨粉_爬取微博用户公开信息,分析为周杰伦打榜的夕阳红老年团,告诉你他们真实年龄!...
- ( 转 )超级惊艳 10款HTML5动画特效推荐
- tmm-jellyfin转移演员照片sftp版