dynamic动力学
创建步骤
1.创建动画者对象,这必须是全局或者强指针指向的对象
2.创建动画,添加动画执行者views
3.设置属性等
4.将动画添加到动画者对象中,执行动画
1.重力
//动画者对象需要创建在全局变量或者viewdidload中,不然会立即销毁
//操作动画
UIGravityBehavior *gra=[[UIGravityBehavior alloc]initWithItems:@[self.redView]];
//重力的方向
gra.angle = M_PI;
// gra.gravityDirection=CGVectorMake(0, 1);
//设置重力
gra.magnitude=1;
//在使用angle属性确定方向的时候,重力属性无论设置在哪里都有效果,但是
//如果使用magnitude属性时,重力属性的设置必须放在后面才有效果,否则无效
//让动画者执行某一个行为
[self.anim addBehavior:gra];
2.碰撞
这个是碰撞的状态,
UICollisionBehaviorModeItems
仅仅是实体和实体直接的碰撞
UICollisionBehaviorModeBoundaries
仅仅是实体和边界之间的碰撞
UICollisionBehaviorModeEverything
所有碰撞
这是确定碰撞状态的方法
@property (nonatomic, readwrite) UICollisionBehaviorMode collisionMode;
这是确定是否以参考系,应该是根layer的bounds为碰撞边界
@property (nonatomic, readwrite) BOOL translatesReferenceBoundsIntoBoundary;
UICollisionBehavior *coll=[[UICollisionBehavior alloc]initWithItems:@[self.redView,self.blueView]];
//设置参考view的bounds作为边界,默认为no
coll.translatesReferenceBoundsIntoBoundary=YES;
// UICollisionBehaviorModeItems
//item和item碰撞
// UICollisionBehaviorModeBoundaries
//item和边界
// UICollisionBehaviorModeEverything
//item和边界还有item都会碰撞
coll.collisionMode=UICollisionBehaviorModeEverything;
[self.anim addBehavior:coll];
3.碰撞边界以及代理
添加碰撞的线,用线来创建边界
[coll addBoundaryWithIdentifier:@"line1" fromPoint:CGPointMake(0, 200) toPoint:CGPointMake(200, 290)];
碰撞的4个代理方法
1.遵循协议
2.创建碰撞对象,设置代理
3.实现代理方法
- (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;
- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(nullable id <NSCopying>)identifier atPoint:(CGPoint)p;
- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(nullable id <NSCopying>)identifier;
4.甩行为
//创建动画者对象
self.anim=[[UIDynamicAnimator alloc]initWithReferenceView:self.view];
//创建动画对象
UISnapBehavior *snap=[[UISnapBehavior alloc]initWithItem:self.redView snapToPoint:p];
//这是振幅
snap.damping=0.8;
//所有dynamic都有的属性,监听,只要动画执行就一直调用
snap.action=^{
NSLog(@"123");
};
//添加动画到动画者对象中执行动画
[self.anim addBehavior:snap];
5.附着行为
UIAttachmentBehavior 必须实现length才能起作用???
5.1.item与item之间
UITouch *t=touches.anyObject;
CGPoint p=[t locationInView:self.view];
//每次重新创建才能每次都移动,如果在viewDidLoad中创建,会导致点击不能改变位置
self.anim=[[UIDynamicAnimator alloc]initWithReferenceView:self.view];
UIAttachmentBehavior *att2=[[UIAttachmentBehavior alloc]initWithItem:self.redView attachedToAnchor:p];
//必须设置这个长度附着到点的属性才能执行
att2.length=40;
[self.anim addBehavior:att2];
5.2.item与点之间
UITouch *t=touches.anyObject;
CGPoint p=[t locationInView:self.view];
//每次重新创建才能每次都移动,如果在viewDidLoad中创建,会导致点击不能改变位置
self.anim=[[UIDynamicAnimator alloc]initWithReferenceView:self.view];
//创建附着属性
UIAttachmentBehavior *att=[[UIAttachmentBehavior alloc]initWithItem:self.redView attachedToAnchor:p];
//必须设置这个长度附着到点的属性才能执行
att.length=20;
[self.anim addBehavior:att];
5.3.offset偏移
UITouch *t=touches.anyObject;
CGPoint p= [t locationInView:self.view];
self.anim=[[UIDynamicAnimator alloc]initWithReferenceView:self.view];
//=====
UIAttachmentBehavior *att=[[UIAttachmentBehavior alloc]initWithItem:self.redView offsetFromCenter:UIOffsetMake(0, 50) attachedToAnchor:p];
att.anchorPoint=p;
att.length=5;
[self.anim addBehavior:att];
5.4.弹性附着和刚性附着
6.推行为
//创建推
// UIPushBehaviorModeContinuous,
// UIPushBehaviorModeInstantaneous
UIPushBehavior *push=[[UIPushBehavior alloc]initWithItems:@[self.redView] mode:UIPushBehaviorModeContinuous];
CGFloat offX= p.x - self.view.center.x;
CGFloat offY= p.y - self.view.center.y;
push.pushDirection=CGVectorMake(-offX,-offY);
push.magnitude=1;
[self.anim addBehavior:push];
7.动力学元素自身属性
UIDynamicItemBehavior *itemB=[[UIDynamicItemBehavior alloc]initWithItems:@[self.redView]];
//这个是自身属性,弹性,取值0-1,越靠近0,弹性越小,越靠近1,弹性越大
itemB.elasticity=0.9;
//密度,默认是1;
itemB.density=1;
//摩擦力的值
itemB.friction=0;
8.练习(毛毛虫)
思路分析
1.创建8个view,并且为8个view设置frame,让他们紧凑排列在一起,并且设置圆角
2.为每个view添加重力属性,碰撞属性,还有附着属性
3.这里需要一个数组来保存每个view,让前一个view和后一个view向附着
4.设置最后一个view的大小,以及他跟随手势的变化,添加手势