我正在尝试使用UIVisualEffectView
创建模态弹出窗口作为其背景。我希望UIVisualEffectView
位于标签栏上,但我看不到实现它的方法。
这就是我所做的,但这不是我想要的输出:
var visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
visualEffectView.frame = self.view.bounds
tabBarController?.view.addSubview(visualEffectView)
//Also tried like this
self.view.window?.addSubview(visualEffectView)
这正是我所寻找的:
所以我的问题是,我应该如何将UIVisualEffectView
添加到标签栏上作为子视图。我知道我可以创建另一个viewController并将其显示为.OverCurrentContext
但这对我来说不是解决方案。
答案 0 :(得分:2)
我重现了将visualEffectView添加到UITabBarController的主视图的问题。对于非半透明标签栏视图,控制器视图不会在其下方扩展,因此高度比您需要的要短。
解决问题更改
visualEffectView.frame = self.view.bounds
为:
visualEffectView.frame = self.tabBarController!.view.bounds
答案 1 :(得分:0)
您可以将其附加到视图层次结构中,但我不建议在生产应用中以这种方式执行此操作;视图堆栈更改(例如,旋转)时有足够的空间容纳错误和崩溃。它仍然完成了工作:
class tabBarController: UITabBarController {
override func viewDidLayoutSubviews() {
let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
visualEffectView.frame = self.view.bounds
let window = UIApplication.shared.keyWindow ?? UIApplication.shared.windows[0]
window.subviews[0].addSubview(visualEffectView)
}
}
你能做什么(争辩:应该)做的是创建一个自定义协议和委托,在需要时在每个标签栏的视图控制器上显示和隐藏你的模态视图(这些视图控制器又可以被子类化为处理代表)。