天天看點

python 實體仿真 動畫_UIDynamic-吸附-重力-碰撞-實體仿真動畫

現實生活中:

運動場實體仿真器

跑步實體仿真行為

人==仿真元素

建立步驟:

1.建立實體仿真器,并且指定仿真範圍

2.建立實體仿真行為,并且指定仿真元素

3.将實體仿真行為添加到仿真器中

Demo:

#pragma mark -懶加載,建立實體仿真器,并且指定仿真範圍

- (UIDynamicAnimator*)dynamicAni

{

if(!_dynamicAni) {

// 1.建立實體仿真器,并且指定仿真範圍

_dynamicAni= [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

}

return_dynamicAni;

}

#pragma mark -點選螢幕響應事件

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event

{

//擷取目前觸摸手指,以及位置

//UITouch *touch = [touches anyObject];

//CGPoint point = [touch locationInView:self.view];

//重力

[self gravity];

//碰撞

//[self collision];

//吸附

//[self snapWithPoint:point];

}

#pragma mark -重力

- (void)gravity

{

// 1.建立實體仿真器,并且指定仿真範圍

// 2.建立實體仿真行為,并且指定仿真元素

UIGravityBehavior*gravity = [[UIGravityBehavior alloc] initWithItems:@[self.purView]];

//設定重力的方向

//gravity.gravityDirection = CGVectorMake(1, 0);

//gravity.gravityDirection = CGVectorMake(0, -1);

//gravity.gravityDirection = CGVectorMake(1, 1);

//設定重力的角度

//gravity.angle = M_PI_2;

//設定重力的加速度

//gravity.magnitude = 100.0;

// 3.将實體仿真行為添加到仿真器中

[self.dynamicAni addBehavior:gravity];

}

#pragma mark -碰撞,有重力方能碰撞

- (void)collision

{

// 1.建立實體仿真器,并且指定仿真範圍

// 2.建立實體仿真行為,并且指定仿真元素

// 2.1建立重力仿真行為

UIGravityBehavior*gravity = [[UIGravityBehavior alloc] initWithItems:@[self.purView]];

gravity.magnitude=3;

// 2.2建立碰撞仿真行為

UICollisionBehavior*collision = [[UICollisionBehavior alloc] initWithItems:@[self.purView,self.redView]];

//碰撞模式

//collision.collisionMode = UICollisionBehaviorModeItems;

//是否設定碰撞的邊界,預設邊界為實體仿真器邊界

//collision.translatesReferenceBoundsIntoBoundary = YES;

//添加直線邊界

//[collision addBoundaryWithIdentifier:@"line" fromPoint:CGPointMake(0, 400) toPoint:CGPointMake(320, 500)];

//添加圖形的邊界,貝賽爾曲線邊界

UIBezierPath*path = [UIBezierPath bezierPathWithOvalInRect:self.view.frame];

[collision addBoundaryWithIdentifier:@"rect" forPath:path];

// 3.将實體仿真行為添加到仿真器中

[self.dynamicAni addBehavior:gravity];

[self.dynamicAni addBehavior:collision];

}

#pragma mark -吸附

- (void)snapWithPoint:(CGPoint)point

{

// 1.建立實體仿真器,并且指定仿真範圍

// 2.建立實體仿真行為,并且指定仿真元素

UISnapBehavior*snap = [[UISnapBehavior alloc] initWithItem:self.purViewsnapToPoint:point];

//設定吸附行為的"減震", 0.0~1.0

snap.damping=.5;

//注意:使用吸附行為,預設隻有一次,如若想要多次必須移除之前的行為再重新添加

[self.dynamicAni removeAllBehaviors];

// 3.将實體仿真行為添加到仿真器中

[self.dynamicAni addBehavior:snap];

}

#pragma mark - QZone

- (void)QZoneAnimation

{

UIButton *addButton = [UIButton buttonWithType:UIButtonTypeContactAdd];

addButton.center=CGPointMake(kScreenW/2,kScreenH-50);

[addButton addTarget:self action:@selector(addButtonAction) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:addButton];

//初始化彈出的控件

UIView*view1 = [[UIView alloc] initWithFrame:CGRectMake(0,0,20,20)];

view1.backgroundColor= [UIColor greenColor];

view1.center=CGPointMake(kScreenW/2,kScreenH-50);

view1.tag=101;

UIView*view2 = [[UIView alloc] initWithFrame:CGRectMake(0,0,20,20)];

view2.backgroundColor= [UIColor purpleColor];

view2.center=CGPointMake(kScreenW/2,kScreenH-50);

view2.tag=102;

UIView*view3 = [[UIView alloc] initWithFrame:CGRectMake(0,0,20,20)];

view3.backgroundColor= [UIColor cyanColor];

view3.center=CGPointMake(kScreenW/2,kScreenH-50);

view3.tag=103;

[self.view insertSubview:view1 belowSubview:addButton];

[self.view insertSubview:view2 belowSubview:addButton];

[self.view insertSubview:view3 belowSubview:addButton];

}

#pragma mark - addButtonAction

- (void)addButtonAction

{

//吸附

//計算坐标

CGPoint point1 =CGPointMake(kScreenW/2-50,kScreenH-60-50);

CGPoint point2 =CGPointMake(kScreenW/2,kScreenH-60-100);

CGPoint point3 =CGPointMake(kScreenW/2+50,kScreenH-60-50);

CGPoint point =CGPointMake(kScreenW/2,kScreenH-50);

UIView *view1 = (UIView*)[self.view viewWithTag:101];

UIView *view2 = (UIView*)[self.view viewWithTag:102];

UIView *view3 = (UIView*)[self.view viewWithTag:103];

// 2.實體仿真行為

UISnapBehavior*snap1 = [[UISnapBehavior alloc] initWithItem:view1 snapToPoint:point1];

UISnapBehavior*snap2 = [[UISnapBehavior alloc] initWithItem:view2 snapToPoint:point2];

UISnapBehavior*snap3 = [[UISnapBehavior alloc] initWithItem:view3 snapToPoint:point3];

UISnapBehavior*snap4 = [[UISnapBehavior alloc] initWithItem:view1 snapToPoint:point];

UISnapBehavior*snap5 = [[UISnapBehavior alloc] initWithItem:view2 snapToPoint:point];

UISnapBehavior*snap6 = [[UISnapBehavior alloc] initWithItem:view3 snapToPoint:point];

if(_isSnap) {

[self.dynamicAniremoveAllBehaviors];

// 3.将實體仿真行為添加到仿真器中

[self.dynamicAni addBehavior:snap1];

[self.dynamicAni addBehavior:snap2];

[self.dynamicAni addBehavior:snap3];

}else{

[self.dynamicAni removeAllBehaviors];

snap4.damping=.8;

snap5.damping=.8;

snap6.damping=.8;

// 3.将實體仿真行為添加到仿真器中

[self.dynamicAni addBehavior:snap4];

[self.dynamicAni addBehavior:snap5];

[self.dynamicAni addBehavior:snap6];

}

_isSnap= !_isSnap;

}

重力:

python 實體仿真 動畫_UIDynamic-吸附-重力-碰撞-實體仿真動畫

碰撞:

python 實體仿真 動畫_UIDynamic-吸附-重力-碰撞-實體仿真動畫

吸附:

python 實體仿真 動畫_UIDynamic-吸附-重力-碰撞-實體仿真動畫

分散:

python 實體仿真 動畫_UIDynamic-吸附-重力-碰撞-實體仿真動畫