前言
在开发中我们经常碰到从底部弹出的弹框界面,如果只是单个的界面,可以使用view
加底部位移动画的方式来完成这样的效果,但如果需要弹出的是一个导航器的情况我们该如何处理了?
普通的底部弹框,只能处理单个界面,如果需要push
到下一个界面无法处理,如果强撸那我们不是要自己写一个导航器?
导航器为基础的弹框,可以进行push
以及pop
的操作
实现原理
iOS
中所有的界面都在最底层的window
中,例如我们初始化程序的时候设置window
的rootViewController
.
同理我们可以再创建一个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;
}];
};