开发中遇到的问题。在一个控制器中有导航、还有底部分栏条,然后需要弹出一个全屏的弹出视图,顶部不到导航条位置。图如下,我遇到的问题是使用push跳转时,跳转的页面在弹出层下面显示,而不是在弹出层上面显示。
图片.png 图片.png问题:为什么push来的页面不应该在最上面显示吗?
然,未必;因为这个弹出视图是添加在当前Window上的,是在导航栈之后进行的添加,所以它的层级在最上面。
你在导航栈中进行push操作,只是在导航栈中将一个控制器放在了最上面(先进后出,后添加的在最上面),比如你有一个盒子(导航栈),里面有许多书,盒子上面放了一个盖子(弹出视图),你将盒子里面的书调整位置,将最后一本抽出来(push)放在第一本上面,你说他会在最上面显示吗?显而易见,不会,因为上面还有一个盖子(弹出视图),所以只需要将盖子拿开就可以看到那本书了,他就会在最上面显示了;想让盖子在最上方显示的时候,那么就拿出来放在盒子上方就好了,知道原理,下面就看代码。
第一步:先显示弹出视图(放一个盖子在盒子上)
UIWindow *curWindow = [[UIApplication sharedApplication].delegate window];
[curWindow addSubview:weakSelf.detailPopView]; // detailPopView弹出视图
第二步:在push之前,将要push的控制器的view放在窗口的最上层,是最上层。使用sendSubviewToBack方法将弹出视图放到下层去。(也就是将弹出视图放在盒子的下面)
[curWindow sendSubviewToBack:self.detailPopView];
[self.navigationController pushViewController:listVC animated:YES];
第三步:在push之后返回时,使用bringSubviewToFront方法,再将弹出视图放在窗口的最上层,就可以了。
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// 如果存在详情弹框,就将它显示在最前面
if (self.detailPopView.superview) {
UIWindow *curWindow = [[UIApplication sharedApplication].delegate window];
[curWindow bringSubviewToFront:self.detailPopView];
}
}
在这里记录一下,如果能帮到你是我的荣幸!谢谢阅读,有问题和建议请留言。
网友评论