初识DynamicAnimator

来源:互联网 发布:linux自动挂载硬盘 编辑:程序博客网 时间:2024/06/11 13:51

使用步骤

  1. 创建一个物理仿真器,并设置范围 UIDynamicAnimator
  2. 创建想要的仿真行为,并添加想要仿真的元素,控件UIXXXBehavior
  3. 将仿真行为添加进仿真器中 [self.dynamicAnimator addBehavior:collisionBehavior];

UIDynamicItem

  1. 任何遵守了UIDynamicItem协议的对象
  2. UIView默认已经遵守了UIDynamicItem协议,因此任何UI控件都能做物理仿真
  3. UICollectionViewLayoutAttributes类默认也遵守UIDynamicItem协议

UIDynamicBehavior

  • UIGravityBehavior:重力行为
  • UICollisionBehavior:碰撞行为
  • UISnapBehavior:捕捉行为
  • UIPushBehavior:推动行为
  • UIAttachmentBehavior:附着行为
  • UIDynamicItemBehavior:动力元素行为

常用函数

  • -(void)addBehavior:(UIDynamicBehavior *)behavior;
    添加1个物理仿真行为

  • -(void)removeBehavior:(UIDynamicBehavior *)behavior;
    移除1个物理仿真行为

  • -(void)removeAllBehaviors;
    移除之前添加过的所有物理仿真行为

常用属性

  • @property (nonatomic, readonly) UIView* referenceView;
    参照视图
  • @property (nonatomic, readonly, copy) NSArray* behaviors;
    添加到物理仿真器中的所有物理仿真行为
  • @property (nonatomic, readonly, getter = isRunning) BOOL running;
    是否正在进行物理仿真
  • @property (nonatomic, assign) id delegate;
    代理对象(能监听物理仿真器的仿真过程,比如开始和结束)
  • @property (readwrite, nonatomic) CGVector gravityDirection;
    重力方向(是一个二维向量)
  • @property (readwrite, nonatomic) CGFloat angle;
    重力方向(是一个角度,以x轴正方向为0°,顺时针正数,逆时针负数)
  • @property (readwrite, nonatomic) CGFloat magnitude;
    量级(用来控制加速度,1.0代表加速度是1000 points /second²)
  • @property (nonatomic, assign) CGFloat damping;
    用于减幅、减震(取值范围是0.0 ~ 1.0,值越大,震动幅度越小)

1. 初始化

-(UIDynamicAnimator *)dynamicAnimator{    if (_dynamicAnimator==nil) {        _dynamicAnimator=[[UIDynamicAnimator alloc]initWithReferenceView:self.view];    }    return _dynamicAnimator;}

2. 碰撞

/** * 碰撞 **/-(void)collisionBehavior{    UIGravityBehavior * gravityBehavior=[[UIGravityBehavior alloc]initWithItems:@[self.redView]];    [self.dynamicAnimator addBehavior:gravityBehavior];    UICollisionBehavior * collisionBehavior=[[UICollisionBehavior alloc]initWithItems:@[self.redView,self.blueView]];    //1. 直线边界    collisionBehavior.translatesReferenceBoundsIntoBoundary=NO;    [collisionBehavior addBoundaryWithIdentifier:@"line" fromPoint:CGPointMake(200, 200) toPoint:CGPointMake(500, 600)];    //2.封闭边界//    UIBezierPath  *bezierPath=[UIBezierPath  bezierPathWithRect:self.view.frame];//    [collisionBehavior addBoundaryWithIdentifier:@"bezierPath" forPath:bezierPath];    [self.dynamicAnimator addBehavior:collisionBehavior];}

3. 重力

/** * 重力 **/-(void)gravityBehavior{    UIGravityBehavior * gravityBehavior=[[UIGravityBehavior alloc]initWithItems:@[self.redView]];    gravityBehavior.gravityDirection=CGVectorMake(1.0, 1.0);    // 设置重力的角度    //    gravityBehavior.angle = M_PI_2;    //设置重力的角速度    gravityBehavior.magnitude=100;    [self.dynamicAnimator addBehavior:gravityBehavior];}

4. 吸附

/** * 吸附 **/-(void)snapDynamicBehaviorsWithPoint:(CGPoint)point{    UISnapBehavior * snapBehavior=[[UISnapBehavior alloc]initWithItem:self.redView snapToPoint:point];    snapBehavior.damping=0;    //如果要进行连续的捕捉行为,需要先把前面的捕捉行为从物理仿真器中移除    [self.dynamicAnimator removeAllBehaviors];    [self.dynamicAnimator addBehavior:snapBehavior];}

5.给一个作用力

/** * 给一个作用力 **/-(void)pushBehavior{    //UIPushBehaviorModeContinuous 连续,UIPushBehaviorModeInstantaneous 瞬时    UIPushBehavior * pushBehavior=[[UIPushBehavior alloc]initWithItems:@[self.redView] mode:UIPushBehaviorModeContinuous];    pushBehavior.action=^(){        NSLog(@"动画进行中");    };    //加速度    pushBehavior.magnitude=0.1;    pushBehavior.pushDirection = CGVectorMake(0, 1.0f);    [self.dynamicAnimator addBehavior:pushBehavior];}
原创粉丝点击