iOS开发-自定义Navigation转场效果

  • 创建实现了UINavigationControllerDelegate的对象
  • 实现动画体
  • 设置NavigationController的代理

1、创建实现了UINavigationControllerDelegate的对象

// CustonNavigationControllerDelegate.m
- (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                            animationControllerForOperation:(UINavigationControllerOperation)operation
                                                         fromViewController:(UIViewController *)fromVC
                                                           toViewController:(UIViewController *)toVC {
    if (operation == UINavigationControllerOperationPop) {
        return _popAnimation;
    }
    if (operation == UINavigationControllerOperationPush) {
        return _pushAnimation;
    }
    return nil;
}

2、实现动画体

@implementation PushTransitionAnimation

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
    return 0.6;
}

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    
    [[transitionContext containerView] addSubview:toViewController.view];
    toViewController.view.alpha = 0;
    
    [UIView animateWithDuration:[self transitionDuration:transitionContext]
                     animations:^{
                         [fromViewController.view setTransform:CGAffineTransformMakeScale(0.1, 0.1)];
                         toViewController.view.alpha = 1.0;
                     }
                     completion:^(BOOL finished) {
                         [fromViewController.view setTransform:CGAffineTransformIdentity];
                         [transitionContext completeTransition:YES];
                     }];
}

@end

3、设置NavigationController的代理

// AppDelegate.m
_navDelegate = [[CustonNavigationControllerDelegate alloc] init];
homeNav.delegate = _navDelegate;

Demo地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容