UIKit力学行为包括了:重力(UIGravityBehavior),碰撞(UICollisionBehavior),吸附(UIAttachmentBehavior),推(UIPushBehavior),甩(UISnapBehavior)和行为限制(UIDynamicItemBehavior).
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
//重力行为
_gravity = [[UIGravityBehavior alloc] initWithItems:@[_box]];
[_animator addBehavior:_gravity];
//碰撞行为
_collision = [[UICollisionBehavior alloc]
initWithItems:@[_box]];
[_collision addBoundaryWithIdentifier:@"barrier" fromPoint:_barrier.frame.origin
toPoint:CGPointMake(_barrier.frame.origin.x + _barrier.frame.size.width, _barrier.frame.origin.y)];
_collision.translatesReferenceBoundsIntoBoundary = YES;
_collision.collisionDelegate = self;
[_animator addBehavior:_collision];
UIDynamicItemBehavior* itemBehaviour = [[UIDynamicItemBehavior alloc] initWithItems:@[_box]];
itemBehaviour.elasticity = 0.5;
[_animator addBehavior:itemBehaviour];
}
- (void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id<UIDynamicItem>)item withBoundaryIdentifier:(id<NSCopying>)identifier atPoint:(CGPoint)p {
if (!_firstContact)
{
_firstContact = YES;
//设置吸附行为
self.attach = [[UIAttachmentBehavior alloc] initWithItem:_attachmentPoint attachedToItem:_box];
[self.animator addBehavior:self.attach];
//设置推行为
UIPushBehavior* push = [[UIPushBehavior alloc] initWithItems:@[_box] mode:UIPushBehaviorModeInstantaneous];
// [push setAngle:-M_PI/4 magnitude:5.0f]; //右上角45度
CGVector pushDirection = {0.5, -0.5}; //setAngle: magnitude:替代方法
[push setPushDirection:pushDirection];
[push setMagnitude:5.0f];
[_animator addBehavior:push];
}
}
另一个我个人认为比較实用,就是甩行为
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
_animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
}
- (IBAction)handleSnapGesture:(UITapGestureRecognizer*)gesture
{
CGPoint point = [gesture locationInView:self.view];
// 移除甩行为
[_animator removeBehavior:_snap];
_snap = [[UISnapBehavior alloc] initWithItem:_box snapToPoint:point];
[self.animator addBehavior:_snap];
}
另一个就是类似桌面随手腕角度改变视图位移的方法
//设置山在X轴的偏移范围-50.0~50.0
UIInterpolatingMotionEffect *mountainEffectX;
mountainEffectX = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x"
type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
mountainEffectX.maximumRelativeValue = @50.0;
mountainEffectX.minimumRelativeValue = @-50.0;
[self.mountain addMotionEffect:mountainEffectX];
//设置树在X轴的偏移范围-100.0~100.0
UIInterpolatingMotionEffect *treeEffectX;
treeEffectX = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x"
type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
treeEffectX.maximumRelativeValue = @100.0;
treeEffectX.minimumRelativeValue = @-100.0;
[self.tree addMotionEffect:treeEffectX];