美文网首页
iOS Modal出半透明控制器

iOS Modal出半透明控制器

作者: 做个有趣的程序员 | 来源:发表于2019-05-05 17:07 被阅读0次

在最近的开发需求里,有一个半透明的页面,从上到下弹出方式,然后在该弹出视图上再Modal和Push其他的页面,之前常规的做法是选择view添加到keyWindow上:

1、如果选择View来完成,modal出一个新页面

[[UIApplication sharedApplication].keyWindow addSubview:self];

由于弹出视图是添加在keyWindow上,modal出的新页面会在弹出的view之下

2.选择添加到window上,显示不会有问题

[[[UIApplication sharedApplication].delegate window] addSubview:self];
//在其他页面modal或push前将视图置于盒子下方
[[[UIApplication sharedApplication].delegate window] sendSubviewToBack:self];
//在返回到该弹窗页面时再将弹窗页面显示在最上方
[[[UIApplication sharedApplication].delegate window] bringSubviewToFront:self];

利用第二种方式能够较好的处理半透明弹窗的显示以及后续的Modal和Push交互,不过该方式在利用View数据传递和交互方式上会有诸多不便,遂考虑使用Modal出控制器的方式,利用VC去做数据传递与交互会便捷很多。

3、选择modal出一个控制器
需要设置modal的style

let modalVC = ModalViewController();
modalVC.modalPresentationStyle = .overCurrentContext
self.navigationController?.present(modalVC, animated: true, completion: nil)
//设置modalVC的背景颜色
view.backgroundColor = UIColor.init(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 0.22)

单单是这样的方式,已经能够满足弹出半透明视图的要求,因为是VC弹出视图后的数据传递与交互方式会很简便。
但是需求总是各种各样的令人匪夷所思的脑洞大开的交互方式:


WechatIMG11.jpeg

再Modal出的半透明A VC上后续还有Modal和Push出B VC的交互方式,接下来继续踩坑之路。。。

4.Modal+Push的交互方式
常规的使用Modal+Push的方式,需要使用UINavigationController包装Modal的VC,然后才能Push到另一个VC,于是需要对Modal出的半透明VC经过一层包装

let modalVC = ModalViewController();
modalVC.modalPresentationStyle = .overCurrentContext
let nav = UINavigationController(rootViewController: modalVC)
self.navigationController?.present(nav, animated: true, completion: nil)

经过这样的设置后,会惊奇的发现,之前Modal出得半透明控制器不再透明了!开始排查问题,查看view的层级结构,发现是UINavigationController的背景遮盖导致弹出的半透明VC不再透明,随即设置nav的背景颜色为clear

nav.view.backgroundColor = .clear

run起来,结果背景变为黑色了,经过一番调试,无论设置什么颜色,都无法modal出之前半透明的VC了,一顿操作猛如虎然并卵后尝试使用同样的方式去设置nav

nav.modalPresentationStyle = .overCurrentContext

见证奇迹的时刻终于到来,完美的达到了想要的效果!其中这两行代码值千金:

nav.modalPresentationStyle = .overCurrentContext
nav.view.backgroundColor = .clear

只有加上这两行代码设置,才能完美的达到Modal出半透明的VC,并在该VC上进行Modal+Modal,Modal+Push的交互。

采用方式1去加载常规的弹窗没问题,但如果涉及到交互弹出其他视图时keyWindow addSubview的方式就会存在坑,半透明的视图弹出交互多的最好使用VC更加方便。经过这次踩坑,对弹出视图中组合Modal与Push的交互方式有了比较深入的了解,以后碰到此类问题,可以快速的选择合适的方式去搞定各种各样的需求。

相关文章

  • iOS Modal出半透明控制器

    在最近的开发需求里,有一个半透明的页面,从上到下弹出方式,然后在该弹出视图上再Modal和Push其他的页面,之前...

  • 13-UI进阶(事件处理)

    控制器的切换方式——Modal 任何控制器都能通过Modal的形式展示出来 Modal的默认效果:新控制器从屏幕的...

  • iOS动画指南 - 6.可以很酷的转场动画

    在iOS开发中,界面间的跳转其实也就是控制器的跳转,跳转有很多种,最常用的有push,modal. modal:任...

  • Modal

    Modal 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展...

  • iOS --切换控制器方式 push / modal / 主窗口

    push push是导航控制器及其子控制器的专权,只有它们才能调用push方法 modal modal是所有控制器...

  • xib加载时的autoresizingMask问题(二)

    1.控制器1modal出控制器2,并且控制器2是通过xib加载出来的.2.在控制器2viewDidLoad方法中给...

  • laravel中mvc、数据库操作

    控制器 在Laravel的MVC结构中,控制器属于C部分,链接M(modal)和V(view)层,将modal层的...

  • iOS自定义转场动画

    ios8自定义转场动画 首先只能在iOS 8后使用默认情况下modal会移除以前控制器的view, 替换为当前弹出...

  • iOS之modal(模态)

    一、简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式...

  • iOS让进行模态的控制器依旧显示而不消失

    modal(模态)是我们在开发中经常使用的一种切换控制器的方法。有时我们需要在一个控制器A上模态出另一个控制器B,...

网友评论

      本文标题:iOS Modal出半透明控制器

      本文链接:https://www.haomeiwen.com/subject/bjocoqtx.html