推力-UIPushBehavior
动画效果的实现要结合之前写到的重力、碰撞行为
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewDidTapGesture:)];
[self.view addGestureRecognizer:tapGesture];
}
- (void)viewDidTapGesture:(UITapGestureRecognizer *)tapGesture {
CGPoint currentTapPoint = [tapGesture locationInView:self.view];
//创建物理仿真器
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
//创建物理仿真行为
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.testView]];
//设置重力仿真的属性(参数)
gravity.gravityDirection = CGVectorMake(0, 1);
gravity.magnitude = 1;
//创建碰撞仿真
UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.testView]];
//设置碰撞仿真属性
collision.translatesReferenceBoundsIntoBoundary = YES;
collision.collisionMode = UICollisionBehaviorModeEverything;
collision.collisionDelegate = self;
UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[self.testView]];
// CGFloat elasticity; // Usually between 0 (inelastic) and 1 (collide elastically)
// CGFloat friction; // 0 being no friction between objects slide along each other
// CGFloat density; // 1 by default
// CGFloat resistance; // 0: no velocity damping
// CGFloat angularResistance; // 0: no angular velocity damping
itemBehavior.elasticity = 0.8;
itemBehavior.friction = 0;
itemBehavior.density = 1;
itemBehavior.resistance = 0;
itemBehavior.angularResistance = 0.2;
//创建推力仿真行为
// UIPushBehaviorModeContinuous, 持续推动
// UIPushBehaviorModeInstantaneous 一次推动
UIPushBehavior *push = [[UIPushBehavior alloc] initWithItems:@[self.testView] mode:UIPushBehaviorModeInstantaneous];
//设置推动仿真属性
// BOOL active;
// CGFloat angle;
// CGFloat magnitude;
// CGVector pushDirection;
push.active = YES;
CGFloat x = currentTapPoint.x - self.testView.center.x;
CGFloat y = currentTapPoint.y - self.testView.center.y;
push.magnitude = sqrtf(x * x + y * y) * 0.01;
push.pushDirection = CGVectorMake(x,y);
//添加仿真行为
[self.animator addBehavior:gravity];
[self.animator addBehavior:collision];
[self.animator addBehavior:itemBehavior];
[self.animator addBehavior:push];
}
源码物理仿真