UIKit 框架中Dynamics (动力:重力,推力,撞击)

来源:互联网 发布:淘宝神笔模板克隆 编辑:程序博客网 时间:2024/04/30 23:40

1.UIGravityBehavior (重力效果)

因为效果需要保持一段时间,所以将动力动画类 以及 效果类 设置成全局属性,来保持其不被释放。

@property (weak, nonatomic) IBOutletUIImageView *box;

@property (strong,nonatomic) UIDynamicAnimator *animator;

@property (strong,nonatomic) UIGravityBehavior *gravityBehavior;

@property (strong,nonatomic)UICollisionBehavior *collision;

@property (strong,nonatomic)UIAttachmentBehavior*attachment;

@property (strong,nonatomic) UISnapBehavior *snapBehavior;

@property (strong,nonatomic)UIPushBehavior *pushBehavior;


先创建 UIDynamicAnimator 动力动画类,来添加莫个效果。

//初始化动力动画类 并指定所作用的视图。

self.animator = [[UIDynamicAnimatoralloc]initWithReferenceView:self.view]; 

// 初始化重力效果类 并指定作用再哪个 物体上(视图)

self.gravityBehavior = [[UIGravityBehavioralloc]initWithItems:@[self.box]];

self.gravity.magnitude=3;// 指定物体的大小

self.gravity.angle=0;//指定施加重力的方向

//添加效果

[self.animatoraddBehavior:self.gravity];

//删除重力效果

[self.animatorremoveBehavior:self.gravityBehavior];

2.碰撞效果

self.collision=[[UICollisionBehavioralloc]initWithItems:@[self.box]];//指定哪个物体具有该效果

self.collision.translatesReferenceBoundsIntoBoundary=YES;//设置物体所碰撞的边界,问是否将动力动画所存在的视图的边界作为碰撞边界

//指定碰撞边界,可以创建UIBezierPath 这个类来绘画边界

UIBezierPath*path=[UIBezierPathbezierPath];

//添加边界   identifier 可以随意

[self.collision addBoundaryWithIdentifier:@"id" forPath:path]; 

//添加效果

[self.animatoraddBehavior:self.collision];

3.attachment 附着效果

//创建手势来改变附着效果

- (IBAction)pan:(UIPanGestureRecognizer *)sender {

    if (sender.state==UIGestureRecognizerStateBegan) {

//初始化 attachment 并指定添加效果的物体 以及附着的锚点, 改变其锚点的位置来实现附着的效果

        self.attachment=[[UIAttachmentBehavioralloc]initWithItem:self.boxattachedToAnchor:CGPointMake(self.box.center.x,self.box.center.y)];

        self.attachment.damping=0.2;//阻尼 阻尼越大回复性越差

        self.attachment.frequency=1;//来回震动的频率

        [self.animatoraddBehavior:self.gravity];

        [self.animatoraddBehavior:self.attachment];

        [selfdrawLineForPath];//可以划一根线连接手机点击屏幕的点和物体中心的连线来更好的观察效果, 这根线实际相当于一根弹簧

    }elseif(sender.state==UIGestureRecognizerStateChanged ){

        CGPoint current=[sender locationInView:self.myview];//改变锚点

        self.attachment.anchorPoint=current;

    

    }elseif(sender.state==UIGestureRecognizerStateEnded){

        [self.animatorremoveBehavior:self.gravity];//删除动画

        [self.animatorremoveBehavior:self.attachment];

        self.myview.path=nil;    

    }

}

4.UISnapBehavior 闪的效果 ,某个物体闪现某个位置,并震动

//通过点击手势来拿到手指所点的位置

- (IBAction)tap:(UITapGestureRecognizer *)sender

{

   CGPoint point = [sender locationInView:self.view];

    [self.animatorremoveBehavior:self.snapBehavior];//删除上一个遗留下来的效果,来达到重置效果的目的,否则效果会小来越弱

    self.snapBehavior = [[UISnapBehavioralloc]initWithItem:self.boxsnapToPoint:point];//初始化snap 并指定物体 和闪向的某个点

    self.snapBehavior.damping=20; 来设定阻尼

    [self.animatoraddBehavior:self.snapBehavior]; 添加效果

}

5.UIPushBehavior(推) 可以对物体的某个方向施加一个推力,来达到推动的物体的效果

 self.pushBehavior = [[UIPushBehavioralloc]initWithItems:@[self.box]mode:UIPushBehaviorModeInstantaneous];

//UIPushBehaviorModeInstantaneous 表示推一下  UIPushBehaviorModeContinuous  //持续的推

self.pushBehavior.magnitude = distance / 100;  推力的大小

   self.pushBehavior.angle = angle;     推力的角度

    self.pushBehavior.active = YES;       是否激活推效果


   [self.animatoraddBehavior:self.pushBehavior];



0 0