(前言)
UIDynamicAnimator(Dynamic)动态(Animator)动画师
它是基于CoreAnimation封装出来的,下一篇博客详细介绍CoreAnimation,今天先只谈使用不谈原理
一、(UIDynamicAnimato介绍)
UIDynamicAnimator继承于NSObject 隶属于UIKit框架,它能够模拟一些生活中的物理现象(Gravity重力)(Collision碰撞)(Snap捕捉)(Push推)(AttachmentBehavior吸附)(DynamicItem物理行为集合)
二、使用UIDynamic
只有遵守了UIDynamicItem协议的对象才可以做物理仿真,UIView遵守了,所以只要继承了UIView便可以使用UIDynamic
在想构建物理引擎的时候(*****重点*****)
1、构建(UIDynamicAnimator)动画师
2、构建(UIDynamicBehavior或其子类)以何种行为进行构建物理引擎
3、把要构建的行为交给动画师
(物理引擎的重点**********UIDynamicAnimator(动画师)**********)
(物理引擎的重点**********UIDynamicBehavior(行为)**********)
有这么几种行为
(1)UIGravityBehavior 重力行为
(2)UICollisionBehavior 碰撞行为
(3)UISnapBehavior 捕捉行为
(4)UIPushBehavior 推动行为
(5)UIAttachmentBehavior 附着行为
(6)UIDynamicItemBehavior 动力元素行为
既然API不是很多~那我们逐一介绍一下
UIGravityBehavior的属性
(1)gravityDirection(重力方向,矢量)
gravityDirection的类型是CGVector(struct结构体类似于CGRrct)所以使用CGVectorMake进行构建(默认值是(0.0 , 1.0),两个值(纵向矢量,横向适量)),纵向矢量(正为向下,负为向上)横向适量(正为向右,负为向左),矢量合起来的值越大,加速度越快(1,1)与(10,10)方向相同,速度不同
(2)angle(重力方向,弧度)
anglel类型是CGFloat(默认值M_PI/2),0向左,M_PI/2向下,M_PI向右,M_PI*3/2向上
(3)magnitude(加速度)
magnitude类型CGFloat(1.0相当于1000points/second^2)(m/s²)
UIGravityBehavior的方法
(1)- (instancetype)initWithItems:(NSArray<id <UIDynamicItem>> *)items;
构造方法Items(是NSArray,向数组中添加UIView或者UIView的子类)表示那些控件需要进行调用物理引擎
(2)- (void)addItem:(id <UIDynamicItem>)item;
动态添加控件对象
(3)- (void)removeItem:(id <UIDynamicItem>)item;
动态移除控件对象
#import "GravityBehaviorVC.h" @interface GravityBehaviorVC () //1、构建(Dynamic)动态(Animator)动画师 @property (strong, nonatomic) UIDynamicAnimator *animator; @property (strong, nonatomic) UIView *view1; @property (strong, nonatomic) UIView *view2; @end @implementation GravityBehaviorVC - (UIDynamicAnimator *)animator { if (!_animator) { _animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view]; } return _animator; } - (UIView *)view1 { if (!_view1) { _view1 = [[UIView alloc]initWithFrame:CGRectMake(20, 80, 80, 80)]; _view1.backgroundColor = [UIColor purpleColor]; } return _view1; } - (UIView *)view2 { if (!_view2) { _view2 = [[UIView alloc]initWithFrame:CGRectMake(40, 180, 80, 80)]; _view2.backgroundColor = [UIColor greenColor]; } return _view2; } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; [self.view addSubview:self.view1]; [self.view addSubview:self.view2]; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //2、创建物理仿真行为 //创建物理仿真行为(Items) UIGravityBehavior *gravity = [[UIGravityBehavior alloc]initWithItems:@[self.view1]]; gravity.magnitude = 3; gravity.gravityDirection = CGVectorMake(3, 3); [self.animator addBehavior:gravity]; //创建碰撞仿真型为 UICollisionBehavior *collision = [[UICollisionBehavior alloc]initWithItems:@[self.view1]]; collision.translatesReferenceBoundsIntoBoundary = YES; [self.animator addBehavior:collision]; }