IOS7动力系统

1.

#import "ViewController.h"

@interface ViewController ()<UICollisionBehaviorDelegate>
{
    UIDynamicAnimator *_animator;//力学动画
    
    UIGravityBehavior *_gravity;//重力行为
    UICollisionBehavior *_collision;//碰撞行为
    //
    BOOL _firstContact;
}

@property(nonatomic,strong)UIView *squareView;
@property(nonatomic,strong)UIPushBehavior *pushBehavior;//推移行为
@property(nonatomic,strong)UISnapBehavior *snapBehavior;//吸附行为
@property(nonatomic,strong)UIDynamicAnimator *dAnimator;//力学动画


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIView *square = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    square.backgroundColor = [UIColor grayColor];
    [self.view addSubview:square];
    
    _animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
    
    //添加重量行为
    _gravity = [[UIGravityBehavior alloc]initWithItems:@[square]];
    [_animator addBehavior:_gravity];
    
    //添加碰撞行为
    _collision = [[UICollisionBehavior alloc]initWithItems:@[square]];
    _collision.translatesReferenceBoundsIntoBoundary = YES;
    [_animator addBehavior:_collision];
    
    //
    UIView *barrier = [[UIView alloc]initWithFrame:CGRectMake(0, 300, 130, 20)];
    barrier.backgroundColor = [UIColor redColor];
    [self.view addSubview:barrier];
    
    //添加碰撞行为
//    _collision = [[UICollisionBehavior alloc]initWithItems:@[square,barrier]];
//    _collision.translatesReferenceBoundsIntoBoundary = YES;
//    [_animator addBehavior:_collision];
    
    //为碰撞行为添加碰撞的边界
    CGPoint rightEdge = CGPointMake(barrier.frame.origin.x+barrier.frame.size.width, barrier.frame.origin.y);
    [_collision addBoundaryWithIdentifier:@"barrier" fromPoint:barrier.frame.origin
                                  toPoint:rightEdge];
    //************************************part2**************************************
    _collision.action = ^{
//        NSLog(@"%@,%@",NSStringFromCGAffineTransform(square.transform),NSStringFromCGPoint(square.center));
    };
    //设置碰撞行为代理
    _collision.collisionDelegate = self;
    //辅助行为
    //设置它们的物理属性(如质量或弹性系数)
//    UIDynamicItemBehavior *itemBeHaviour = [[UIDynamicItemBehavior alloc]initWithItems:@[square]];
//    itemBeHaviour.elasticity = 0.6;//弹性系数属性
//    itemBeHaviour.friction = 0.6;//摩擦系数
//    itemBeHaviour.density = 9.8;//密度
//    itemBeHaviour.resistance = 0.6;//阻力
//    itemBeHaviour.angularResistance = 0.1;//转动阻力
//    itemBeHaviour.allowsRotation = NO;//允许旋转
//    [_animator addBehavior:itemBeHaviour];
    
}

#pragma mark -collisionDelegate Methods-
-(void)collisionBehavior:(UICollisionBehavior *)behavior
     beganContactForItem:(id<UIDynamicItem>)item
  withBoundaryIdentifier:(id<NSCopying>)identifier
                 atPoint:(CGPoint)p{
    NSLog(@"Boundary contact occurred - %@", identifier);
    UIView *view = (UIView *)item;
    view.backgroundColor = [UIColor yellowColor];
    [UIView animateWithDuration:0.3 animations:^{
        view.backgroundColor= [UIColor grayColor];
    }];
    //动态添加行为
    if (!_firstContact) {
        _firstContact = YES;
        UIView *square = [[UIView alloc]initWithFrame:CGRectMake(30, 0, 100, 100)];
        square.backgroundColor = [UIColor grayColor];
        [self.view addSubview:square];
        
        [_collision addItem:square];
        [_gravity addItem:square];
        //附件行为
        UIAttachmentBehavior *attach = [[UIAttachmentBehavior alloc]initWithItem:view
                                                                  attachedToItem:square];
        [_animator addBehavior:attach];
    }
}

//////////////////////////////////////////part3推移行为和吸附行为
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [self createSmallSquareView];
    [self createGestureRecognizer];
    [self createAnimatorAndBehaviors];
    
}

- (void) createSmallSquareView{
    self.squareView =[[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 80.0f, 80.0f)];
    
    self.squareView.backgroundColor = [UIColor greenColor];
    self.squareView.center = self.view.center;
    
    [self.view addSubview:self.squareView];
}

- (void) createGestureRecognizer{  //侦测视图单击
    UITapGestureRecognizer *tapGestureRecognizer =
    [[UITapGestureRecognizer alloc] initWithTarget:self  action:@selector(handleTap:)];
    [self.view addGestureRecognizer:tapGestureRecognizer];
}

- (void) createAnimatorAndBehaviors{
    self.dAnimator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

    //碰撞行为
    UICollisionBehavior *collision = [[UICollisionBehavior alloc]
                                      initWithItems:@[self.squareView]];
    collision.translatesReferenceBoundsIntoBoundary = YES;
    [self.dAnimator addBehavior:collision];
    //推移行为
    self.pushBehavior = [[UIPushBehavior alloc]
                         initWithItems:@[self.squareView]
                         mode:UIPushBehaviorModeContinuous];//推移模式
    
    [self.dAnimator addBehavior:self.pushBehavior];
     
}

/*
 ///推移行为
- (void) handleTap:(UITapGestureRecognizer *)paramTap{
    CGPoint tapPoint = [paramTap locationInView:self.view];
    CGPoint squareViewCenterPoint = self.squareView.center;
    //设置推移的角度
    CGFloat deltaX = tapPoint.x - squareViewCenterPoint.x;
    CGFloat deltaY = tapPoint.y - squareViewCenterPoint.y;
    CGFloat angle = atan2(deltaY, deltaX);
    [self.pushBehavior setAngle:angle];
    
    //勾股
    CGFloat distanceBetweenPoints =
    sqrt(pow(tapPoint.x - squareViewCenterPoint.x, 2.0) +
         pow(tapPoint.y - squareViewCenterPoint.y, 2.0));
    //double pow(double x, double y);计算以x为底数的y次幂
    //double sqrt (double);开平方
    
    [self.pushBehavior setMagnitude:distanceBetweenPoints / 200.0f]; //推力的大小(移动速度)
    //每1个magnigude将会引起100/平方秒的加速度,这里分母越大,速度越小
}
*/

///吸附行为
- (void) handleTap:(UITapGestureRecognizer *)paramTap{
    CGPoint tapPoint = [paramTap locationInView:self.view];
    
    if (self.snapBehavior != nil){
        [self.dAnimator removeBehavior:self.snapBehavior];
    }
    self.snapBehavior = [[UISnapBehavior alloc] initWithItem:self.squareView
                                                 snapToPoint:tapPoint];
    self.snapBehavior.damping = 0.5f;  //剧列程度
    [self.dAnimator addBehavior:self.snapBehavior];
}


@end

 

posted @ 2015-06-14 16:12  forrHuen  阅读(144)  评论(0编辑  收藏  举报