iOS 自定义转场动画 persent&dismiss , push&pop
这是第一次自定义转场动画,话不多说,先看下效果图:
1.我们需要自定义一个遵循的<UIViewControllerAnimatedTransitioning>协议的动画过渡管理对象:
typedef NS_ENUM(NSUInteger, PJXTransitionType) {
PJXTransitionTypePresent = 0,//管理present动画
PJXTransitionTypeDissmiss,//管理dismiss动画
PJXTransitionTypePush,
PJXTransitionTypePop,
};
@interface PJXAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic,assign)PJXTransitionType transitionType;
@end
2.遵循协议后有两个必须要实现的方法:
//返回动画事件
- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext;
//所有的过渡动画事务都在这个方法里面完成
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;
3.实现两个协议方法,因为这里是实现协议的内容差距不大,所以使用枚举来确认需要执行的过度动画
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{
return 0.4;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
switch (_transitionType) {
case PJXTransitionTypePresent:
[self presentAnimation:transitionContext];
break;
case PJXTransitionTypeDissmiss:
[self dismissAnimation:transitionContext];
break;
case PJXTransitionTypePush:
[self pushAnimation:transitionContext];
break;
case PJXTransitionTypePop:
[self popAnimation:transitionContext];
break;
}
}
4.根据类型的不同来执行不相同的动画,首先是Present动画
第一、Present动画
- (void)presentAnimation:(id<UIViewControllerContextTransitioning>)transitionContext
{
//通过viewControllerForKey取出转场前后的两个控制器,这里toVC就是vc1、fromVC就是vc2
UIViewController * toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController * fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
//缩小动画,这里没有使用3D动画,不知怎的,使用3D动画有点卡顿
CGAffineTransform transform = CGAffineTransformMakeScale(0.9, 0.9);
CGRect scBound = [UIScreen mainScreen].bounds;