动力效果之碰撞特效

#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];
/*
     碰撞效果 UICollisionBehavior
     可以让物体之间实现碰撞效果
     也可以通过添加边界(boundary)在边界实现碰撞效果

     边界相关的方法
     - (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier forPath:(UIBezierPath*)bezierPath; 添加一个贝塞尔曲线路径的边界
     - (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier fromPoint:(CGPoint)p1 toPoint:(CGPoint)p2; 通过添加两个点连成的线 作为边界
     - (UIBezierPath*)boundaryWithIdentifier:(id <NSCopying>)identifier; 通过ID找到边界路径
     - (void)removeBoundaryWithIdentifier:(id <NSCopying>)identifier; 移除ID对应的边界
     @property (nonatomic, readonly, copy) NSArray* boundaryIdentifiers; 边界数组
     - (void)removeAllBoundaries;移除所有边界

     碰撞的方式
     typedef NS_OPTIONS(NSUInteger, UICollisionBehaviorMode) {
     UICollisionBehaviorModeItems        = 1 << 0,元素碰撞
     UICollisionBehaviorModeBoundaries   = 1 << 1,边界碰撞
     UICollisionBehaviorModeEverything   = NSUIntegerMax 全体碰撞
     } NS_ENUM_AVAILABLE_IOS(7_0);

     // 视图碰撞边界的时候 触发
     - (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier atPoint:(CGPoint)p;
     - (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier;

     //两个元素相互碰撞
     - (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2 atPoint:(CGPoint)p;
     - (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2;
     */
}
#pragma mark 动力效果器的代理方法
//启动
- (void)dynamicAnimatorWillResume:(UIDynamicAnimator*)animator{

}
//暂停
- (void)dynamicAnimatorDidPause:(UIDynamicAnimator*)animator{

}
#pragma mark 手指触摸屏幕添加动力效果
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];
    view.center = touchPoint;
}
- (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];

#pragma mark 碰撞效果
    /*
//    初始化碰撞效果的对象  ,并给View添加碰撞的效果
    UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc]initWithItems:@[view]];
//    把动力效果器的范围当做边界
    collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
    collisionBehavior.collisionDelegate = self;
#pragma mark 通过两个点画一条线当做边界
//    [collisionBehavior addBoundaryWithIdentifier:@"line" fromPoint:CGPointMake(0, 300) toPoint:CGPointMake(100, 600)];
//    [collisionBehavior addBoundaryWithIdentifier:@"line1" fromPoint:CGPointMake(375, 300) toPoint:CGPointMake(275, 600)];
#pragma mark 通过一个圈来当做边界

    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 200, 375, 375)];
    [collisionBehavior addBoundaryWithIdentifier:@"圆形" forPath:path];
    [animator addBehavior:collisionBehavior];
     */
#pragma mark 两个视图之间的碰撞

    UICollisionBehavior *coll = [[UICollisionBehavior alloc]initWithItems:@[view,view2]];
    coll.translatesReferenceBoundsIntoBoundary = YES;
//    如果是两个元素之间相互碰撞  设置边界 也不起作用
    coll.collisionMode = UICollisionBehaviorModeEverything;
    coll.collisionDelegate = self;
    [animator addBehavior:coll];
}
- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2 atPoint:(CGPoint)p{

}
- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2{

}

#pragma mark  碰撞动力效果的代理方法
- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier atPoint:(CGPoint)p{
    NSLog(@"%f\n%f",p.x,p.y);
}
- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(id <NSCopying>)identifier{

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值