iOS 弹出半屏的导航器

前言

在开发中我们经常碰到从底部弹出的弹框界面,如果只是单个的界面,可以使用view加底部位移动画的方式来完成这样的效果,但如果需要弹出的是一个导航器的情况我们该如何处理了?

普通的底部弹框,只能处理单个界面,如果需要push到下一个界面无法处理,如果强撸那我们不是要自己写一个导航器?

Jietu20200909-145752.gif

导航器为基础的弹框,可以进行push以及pop的操作

Jietu20200909-145141.gif

实现原理

iOS中所有的界面都在最底层的window中,例如我们初始化程序的时候设置windowrootViewController.
同理我们可以再创建一个window将其放在屏幕中你想展示的位置即可.

相关代码

            //创建蒙层
            UIView * view = [[UIView alloc] init];
            view.backgroundColor = UIColor.blackColor;
            view.alpha = 0.2;
            view.frame = BTUtils.APP_WINDOW.bounds;
            [BTUtils.APP_WINDOW addSubview:view];
            
            //创建测试导航器以及vc
            TestWindowViewController * vc=[TestWindowViewController new];
            BTNavigationController * nav = [[BTNavigationController alloc] initWithRootViewController:vc];
            
            //创建window,并将window的坐标设置在屏幕底部,设置windowLevel防止获取默认window失败
            self.testWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, BTUtils.SCREEN_H, BTUtils.SCREEN_W, BTUtils.SCREEN_H - 200)];
            self.testWindow.windowLevel = UIWindowLevelAlert;
            self.testWindow .backgroundColor = UIColor.redColor;
            [self.testWindow  setBTCornerRadiusTop:10];
            self.testWindow .rootViewController = nav;
            self.testWindow.hidden = NO;
            
            //执行弹出的加载动画
            [UIView animateWithDuration:.35 animations:^{
                self.testWindow .BTTop = 200;
            }];
            
            //消失的回调处理
            __weak ViewController * weakSelf=self;
            vc.blockSuccess = ^(NSObject * _Nullable obj) {
                [UIView animateWithDuration:.35 animations:^{
                    self.testWindow .BTTop = BTUtils.SCREEN_H;
                } completion:^(BOOL finished) {
                    [view removeFromSuperview];
                    weakSelf.testWindow.rootViewController = nil;
                    weakSelf.testWindow = nil;
                }];
                
            };

你可能感兴趣的:(iOS 弹出半屏的导航器)