iOS - iOS平移旋轉動畫 通過核心動畫實現(動畫組)
阿新 • • 發佈:2019-02-11
有時需要對某個特定的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]; }