早期技术文章搬家,原文链接

大部分人或许觉得动画用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(物理碰撞,动画)相关推荐

  1. iOS UIKit:viewController之动画(5)

    当弹出一个view controller时,UIKit提供了一些标准转换动画,并且也支持用户自定义的动画效果. 1 UIView动画 UIView是自带动画实现功能,其中有两种方式实现:        ...

  2. IOS碰撞动画(降落动画)

    // //  Created by dkb on 15/9/27. //  Copyright © 2015年 dkb. All rights reserved. // // OC 实现 #impor ...

  3. UIKit Dynamics入门

    看E问文章时,发现了Dynamics,uikit动力,找了不错的入门文章. From:http://blog.csdn.net/baecheung/article/details/11911061 本 ...

  4. 【IOS开发进阶系列】动画专题

    1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hello_Hwc/archive/123447.html 1.1 基本概念 1.1.1 CA ...

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

    本文转载自:破船之家 本文地址:iOS7新特征汇总[05]初窥UIKit动力(UIKit Dynamics) QQ20130615-6 此图来此WWDC视频 小引 通过之前的4篇文章,笔者把iOS7中 ...

  6. iOS UIKit框架注解

    本文来自简书,原文地址:http://www.jianshu.com/p/e5b995ecf44d 导语 我们追求技术的提升,关注技术的发展历程:作为从事技术工作的伐码猿,有个想法(仅是个人想法),这 ...

  7. iOS7—Day by day—Day0:UIKit Dynamics

    这篇文章是天天品尝iOS7甜点系列的一部分,你可以查看完整的系列目录:天天品尝iOS7甜点 伴随着介绍苹果的iOS7,将会使你清晰的认清设备和现实世界的相互作用,UIKit Dynamics就是众多新 ...

  8. iOS7 UIKit Dynamics 的初步研究

    这回开始学习iOS7新的UIKit Dynamics,我看有人翻译成UIKit 力学,我觉得倒挺贴切的,所以就借来用一用. 这个UIKit力学系统里要设计到四个东西: 1.UIDynamicAnima ...

  9. IOS项目之弹出动画二

    在IOS项目之弹出动画一中只是实现也功能,并没有体现面向对象的思想 ,今天就试着把它封装了一下,弹出视图的内容可以根据自定义,此处只是用UIDatePicker来演示 我把它传到了GitHub上    ...

最新文章

  1. 想详细了解风头正劲的联邦学习吗?这篇最强综述论文满足你
  2. 关于使用asp.net调试器出现的问题及相关解决方法
  3. VTK:可视化之ShadowsLightsDemo
  4. MySQL中索引的分类和基本操作
  5. Java Web乱码分析及解决方案
  6. c#设计模式-建造者模式
  7. combox 增加请选择_本命佛怎么请?
  8. java教学楼的属性_java设计一个父类建筑物building,由它派生出教学楼类classroom,然后采用一些数据进行测试....
  9. windows证书地址
  10. 【MyBatis笔记】05-传统开发模式DAO
  11. 数据库的点数据根据行政区shp来进行行政区处理,python定时器实现
  12. 【雷达通信】基于matlab CDIF算法雷达信号分选【含Matlab源码 1186期】
  13. 四、ip classless与默认路由
  14. ios备忘录下载安卓版_ios8备忘录app软件下载
  15. linux下ftp客户端主动模式设置
  16. 下载测试视频网站分享
  17. 称重仪表显示ol怎么解决_称重仪表显示Erd和数字是怎么回事?
  18. 服务器系统2008恢复,win2003升级为win2008、win2012保留数据重装恢复数据说明
  19. Fsm hdlc_HDLbits
  20. vue实现某一区域滚动,头部底部固定,中间滚动

热门文章

  1. 铺地砖问题 java
  2. ISIJ 2022收官,中国初中生再展风采
  3. SUM服务器监控软件全面介绍
  4. linux乱码,文件名乱码、文件内容乱码,JDK编码。 CKFinder文件名称乱码 (使用UTF-8解决)
  5. 记录爬取知识点中的图片
  6. 【SDN vs. NFV】纠缠不清的SDN和NFV
  7. 痞子衡嵌入式:浅谈i.MXRT1xxx系列MCU时钟相关功能引脚的作用
  8. python微博涨粉_爬取微博用户公开信息,分析为周杰伦打榜的夕阳红老年团,告诉你他们真实年龄!...
  9. ( 转 )超级惊艳 10款HTML5动画特效推荐
  10. tmm-jellyfin转移演员照片sftp版