/*
重力效果:UIGravityBehavior设置重力方向 加速度 让物体(视图)朝着重力方向掉落
重要属性:
@property (nonatomic, readonly, copy) NSArray *items;添加到重力效果中的所有效果作用对象
@property (readwrite, nonatomic) CGVector gravityDirection;重力方向(是一个二维向量)以左上角为坐标原点 x 负数向左 正数向右 y 负数向上 正数向下 数字越大 重力效果越大
@property (readwrite, nonatomic) CGFloat angle;重力方向(是一个角度,x轴正方向为0°,顺时针正数,逆时针负数)
@property (readwrite, nonatomic) CGFloat magnitude;量级(用来控制加速度,1.0代表加速度是1000 points /second²)重力加速度越大 碰撞越厉害
*/
#import "ViewController.h"
@interface ViewController()<UIDynamicAnimatorDelegate,UICollisionBehaviorDelegate>
{
UIDynamicAnimator *animator;
UIView *view;
UIView *view2;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// UIDynamicAnimator
/*
UIDynamic是从ios7开始引入的一种新技术 属于UIKit框架 可以模拟现实生活中的物理现象 如碰撞 抖动 摆动 等
动力效果:如动吉他,电吉他有效果器 可以添加各种电子效果
动力效果也有一个效果器,叫做动力效果器,里面可以添加动力效果
电吉他可以叠加多个效果 动力效果也是一样
动力效果的使用步骤:
1、创建动力效果器(UIDynamicAnimator)
2、创建动力效果(Behavior)添加到对应的视图上
3、将动力效果添加到动力效果器中开始动力效果
再是用动力效果的时候必须遵守UIDynamicItem这个协议才可以使用动力效果
UIView默认遵守了UIDynamicItem协议
UIDynamic提供的动力效果
UIGravityBehavior:重力效果
UICollisionBehavior:碰撞效果
UIDynamicItemBehavior:动力元素效果
UIPushBehavior:推动效果
UISnapBehavior:迅速移动效果
UIAttachmentBehavior:附着效果
都继承自UIDynamicBehavior
动力效果器:UIDynamicAnimator
可以把UIDynamicAnimator看做动力效果的容器 它制定了动力效果的有效范围
在初始化的时候可以指定他的有效范围
- (instancetype)initWithReferenceView:(UIView*)view;
作用在哪一个view上 哪一个view就是他产生动力效果的有效范围
既然是容器 他还可以添加移除 动力效果
- (void)addBehavior:(UIDynamicBehavior *)behavior; 添加动力效果
- (void)removeBehavior:(UIDynamicBehavior *)behavior; 移除动力效果
- (void)removeAllBehaviors; 移除之前添加过的所有动力效果
动力效果器常用的属性
@property (nonatomic, readonly) UIView* referenceView;作用的区域
@property (nonatomic, readonly, copy) NSArray* behaviors;添加到效果器中的所有效果
@property (nonatomic, readonly, getter = isRunning) BOOL running;是否正在进行
@property (nonatomic, assign) id <UIDynamicAnimatorDelegate> delegate;可以检测开始暂停
- (void)dynamicAnimatorWillResume:(UIDynamicAnimator*)animator;
- (void)dynamicAnimatorDidPause:(UIDynamicAnimator*)animator;
*/
animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
// self.view是产生动力效果的区域
animator.delegate = self;
view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
view.layer.cornerRadius = 50;
view.backgroundColor = [UIColor colorWithRed:0.345 green:1.000 blue:0.391 alpha:1.000];
[self.view addSubview:view];
view2 = [[UIView alloc]initWithFrame:CGRectMake(50, 200, 100, 100)];
view2.layer.cornerRadius = 50;
view2.backgroundColor = [UIColor colorWithRed:1.000 green:0.282 blue:0.298 alpha:1.000];
[self.view addSubview:view2];
}
#pragma mark 动力效果器的代理方法
//启动
- (void)dynamicAnimatorWillResume:(UIDynamicAnimator*)animator{
}
//暂停
- (void)dynamicAnimatorDidPause:(UIDynamicAnimator*)animator{
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
#pragma mark 重力效果
// 把之前添加过的重力效果移除
[animator removeAllBehaviors];
// 初始化重力效果
UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc]initWithItems:@[view]];
// 设置掉落方向
gravityBehavior.gravityDirection = CGVectorMake(0, 1);
// 设置加速度 数值越大 碰撞效果越大
gravityBehavior.magnitude = 1;
// 添加到效果器里面
[animator addBehavior:gravityBehavior];
}