动力效果动画
UIDynamic是从iOS7开始引入的一种新技术,属于UIKit框架,可以模拟现实生活中的物理现象
玩动力效果 如电吉他
动力效果器也有一个效果器 叫做 动力效果器 里面可以提那家动力效果。
动力效果切换效果,会把上一个效果移除
动力效果,可以叠加对个效果
使用UIDynamic 大体步骤:
1、创建一个动力效果器(UIDynamicAniamtor)
2、创建动力效果(Behavior)添加到对应的视图上
UIDynamic提供的动力效果
UIGravityBehavior:重力效果
UICollisionBehavior:碰撞效果
UIDynamicItemBehavior:动力元素效果
UIPushBehavior:推动效果
UISnapBehavior:迅速移动效果
UIAttachmentBehavior:附着效果
1、添加重力效果
// 动力效果器的类
UIDynamicAnimator *dynamicAnimator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
// self.view 是它产生动力效果的有效区域
dynamicAnimator.delegate = self;
// 把之前 添加过的动力效果 移除
[dynamicAnimator removeAllBehaviors];
// 在view1上 添加动力效果
UIGravityBehavior *gravity = [[UIGravityBehavior alloc]initWithItems:@[view1]];
// 设置 加速度 数值越大 碰撞效果越大
gravity.magnitude = 50;
/*
sturct CGVector{
CGFloat dx; 负数向左 正数向右
CGFloat dy; 负数向上 正数向下
}
*/
// 设置 动力效果的方向
gravity.gravityDirection = CGVectorMake(0, 1);
// 添加到效果器 开始动力效果
[dynamicAnimator addBehavior:gravity];
2、添加碰撞效果
a、单个视图的碰撞效果(边界碰撞)
UICollisionBehavior *collision = [[UICollisionBehavior alloc]initWithItems:@[view1]];
// 把动力效果器的范围 当做边界
collision.translatesReferenceBoundsIntoBoundary = YES;
collision.collisionDelegate = self;
// 添加两个点 画了一条直线 当做边界
// [collision addBoundaryWithIdentifier:@"line1" fromPoint:CGPointMake(0, 300) toPoint:CGPointMake(400, 600)];
// [collision addBoundaryWithIdentifier:@"line2" fromPoint:CGPointMake(300, 0) toPoint:CGPointMake(300, 600)];
// 通过贝塞尔曲线 画一个圆形
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 200, 200, 200)];
[collision addBoundaryWithIdentifier:@"circle" forPath:path];
[dynamicAnimator addBehavior:collision];
b、两个视图碰撞
// 两个视图之间 相互碰撞
UICollisionBehavior *collision =[[ UICollisionBehavior alloc]initWithItems:@[view1, view2]];
collision.translatesReferenceBoundsIntoBoundary =YES;
// 如果设置 两个视图的碰撞效果 边界设置则不管用 collision.collisionMode = UICollisionBehaviorModeEverything;
collision.collisionDelegate = self;
[dynamicAnimator addBehavior:collision];
3、动力元素效果
// 可以与其他的 动力效果 配合使用
UIDynamicItemBehavior *dynamicItem = [[UIDynamicItemBehavior alloc]initWithItems:@[view1, view2]];
// 设置元素的跳跃度(0-1)
dynamicItem.elasticity = 0.8;
[dynamicAnimator addBehavior:dynamicItem];
代理方法的使用:
UICollisionBehavior的代理方法
//两个元素相互碰撞
- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id )item1 withItem:(id )item2 atPoint:(CGPoint)p;
- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id )item1 withItem:(id )item2;
// 视图碰撞边界的时候 触发
- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id )item withBoundaryIdentifier:(id )identifier atPoint:(CGPoint)p;
- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id )item withBoundaryIdentifier:(id )identifier;
重力效果器的代理方法
- (void)dynamicAnimatorWillResume:(UIDynamicAnimator*)animator{
NSLog(@"启动");
}
- (void)dynamicAnimatorDidPause:(UIDynamicAnimator*)animator{
NSLog(@"暂停");
}