新写的一个动画(其实是别人的)
这里有自定义转场动画的解释
这里是Demo
这里主要用到了layer的mask属性,用来实现这种扩散的效果
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
_transitionContext = transitionContext;
UIView * containerView = [transitionContext containerView];
UIViewController * fromeViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController * toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
[containerView addSubview:toViewController.view];
UIBezierPath * circleInit = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(335, 64, 44, 44)];
CGPoint extremePoint = CGPointMake(335+22 - 0, 64+22 - CGRectGetHeight(toViewController.view.bounds));
CGFloat radius = sqrt((extremePoint.x*extremePoint.x) + (extremePoint.y*extremePoint.y));
UIBezierPath * circleFinal = [UIBezierPath bezierPathWithOvalInRect:CGRectInset(CGRectMake(335, 64, 44, 44), -radius, -radius)];
NSLog(@"RECk : %@",NSStringFromCGRect(CGRectInset(CGRectMake(335, 64, 44, 44), -radius, -radius)));
CAShapeLayer * masklayer = [CAShapeLayer layer];
masklayer.path = circleFinal.CGPath;
toViewController.view.layer.mask = masklayer;
CABasicAnimation * animation = [CABasicAnimation animation];
animation.keyPath = @"path";
animation.fromValue = (__bridge id _Nullable)(circleInit.CGPath);
animation.toValue = (__bridge id _Nullable)(circleFinal.CGPath);
animation.duration = 0.3;
animation.delegate = self;
[masklayer addAnimation:animation forKey:@"path"];
}