使自定义viewcontroller覆盖导航栏

Posted

技术标签:

【中文标题】使自定义viewcontroller覆盖导航栏【英文标题】:Make the custom viewcontroller cover the navigation bar 【发布时间】:2018-02-28 15:19:51 【问题描述】:

我正在我的主视图控制器上显示一个自定义弹出窗口。为此,我在情节提要中创建了一个视图控制器(如图所示),对应的类如下。

class PopUpViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.black.withAlphaComponent(0.7)
        self.showAnimate()
    

    func showAnimate()
    
        self.view.alpha = 1.0
    

    func removeAnimate()
    
        UIView.animate(withDuration: 0.0, animations: 
            self.view.alpha = 0.0;
        , completion:(finished : Bool)  in
            if (finished) 
                self.view.removeFromSuperview()
            
        );
    

然后在我的主视图控制器中,我在单击按钮时显示此弹出窗口,如下所示:

let popOverVC = UIStoryboard(name: "MainViewController", bundle: nil).instantiateViewController(withIdentifier: "popup") as! PopUpViewController
self.addChildViewController(popOverVC)
popOverVC.view.frame = self.view.bounds
self.view.addSubview(popOverVC.view)
popOverVC.didMove(toParentViewController: self)

当添加弹出窗口时,这会使主视图控制器的背景变黑,不透明度为 70%。如何让导航栏也有同样的背景效果?

我已尝试更新:

self.view.window?.backgroundColor = UIColor.black.withAlphaComponent(0.7)

self.navigationController?.navigationBar.backgroundColor = UIColor.black.withAlphaComponent(0.7)

在 viewDidLoad() 中但没有工作。任何可能的解决方案?

【问题讨论】:

你试过这样self.navigationController?.navigationBar.backgroundColor = UIColor(red:0.00, green:0.00, blue:0.00, alpha:0.7) 吗? @Ahmet Ustem 我也尝试过这样但不起作用。我得到了下面的解决方案。谢谢。 【参考方案1】:

如果我理解正确,您正在将popOverVC 作为子视图添加到嵌入在UINavitationController 中的mainViewController 的视图中。如果是这种情况,那么popOverVC 不覆盖导航栏是合乎逻辑的,因为导航栏是navigationController 的子视图,而不是mainViewController 的子视图。为了能够覆盖导航栏,您必须将 popOverVC 添加到 navigationController

// to make things a bit easier working with the optional self.navigationController
guard let navController = self.navigationController else  return 

let popOverVC = UIStoryboard(name: "MainViewController", bundle: nil).instantiateViewController(withIdentifier: "popup") as! PopUpViewController
navController.addChildViewController(popOverVC)
popOverVC.view.frame = navController.view.bounds
navController.view.addSubview(popOverVC.view)
popOverVC.didMove(toParentViewController: navController)

【讨论】:

我可以请求您使用 popOverVC.view.frame = navController.view.bounds 更新 popOverVC.view.frame = self.navController.view.bounds 您的解决方案有效,非常感谢 :)跨度> @MilanNosáľ 我实施了您的解决方案及其工作。但是,在关闭子视图后,按钮(在导航栏上)点击工作,但视图没有相应改变。我该如何解决这个问题? @KushalShrestha 您是否从 superview 中删除了 popOverVC.view?这是我现在唯一想到的事情

以上是关于使自定义viewcontroller覆盖导航栏的主要内容,如果未能解决你的问题,请参考以下文章

使用布局锚使自定义导航栏项居中

呈现一个模态视图控制器,但不要隐藏导航栏

具有相同操作的所有 viewController 的通用导航栏

每个 ViewController 在标签栏内都有自己的导航栏(iOS)

自定义大小的表格视图仍然使用导航栏的偏移量

在导航栏按钮项中添加自定义图像时丢失 Segue 操作