有时需要对某个特定的View进行平移+旋转的操作,其实很简单,只需要一个动画组就可以解决:
#pragma mark 动画
- (void)tipAnimation:(UIView *)tipView toPoint:(CGPoint)toPoint angle:(CGFloat)angle{
//平移
CGPoint fromPoint = tipView.center;
UIBezierPath *movePath = [UIBezierPath bezierPath];
[movePath moveToPoint:fromPoint];
CGPoint newtoPoint = CGPointMake(fromPoint.x+toPoint.x , fromPoint.y+toPoint.y) ;
[movePath addLineToPoint:newtoPoint];
CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
moveAnim.path = movePath.CGPath;
moveAnim.duration = self.animationDuration;
moveAnim.repeatCount = 1;
moveAnim.removedOnCompletion = NO;
moveAnim.fillMode = kCAFillModeForwards;
moveAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
//旋转
CABasicAnimation *TransformAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
TransformAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
//沿Z轴旋转
TransformAnim.toValue = [NSValue valueWithCATransform3D: CATransform3DMakeRotation(angle,0,0,1)];
TransformAnim.cumulative = YES;
TransformAnim.duration =self.animationDuration;
TransformAnim.repeatCount = 1;
tipView.center = toPoint;
TransformAnim.removedOnCompletion = NO;
TransformAnim.fillMode = kCAFillModeForwards;
TransformAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
//动画组
CAAnimationGroup *animGroup = [CAAnimationGroup animation];
animGroup.animations = [NSArray arrayWithObjects:moveAnim, TransformAnim, nil];
animGroup.duration = self.animationDuration;
animGroup.repeatCount = 1;
animGroup.removedOnCompletion = NO;
animGroup.fillMode = kCAFillModeForwards;
[tipView.layer addAnimation:animGroup forKey:nil];
}