我想要一个 UIView 覆盖整个屏幕甚至导航栏,但显示它的子视图

I want a UIView to cover the whole screen even navigationbar but show its subviews

如何让UIView覆盖整个屏幕。我有一个黑色的 UIView,它的 alpha 值为 0.5。它也有一个子视图。现在 blackView 位于导航栏下方。我希望它覆盖整个屏幕,包括导航栏。

如下图所示。弹出视图后面的暗视图应该覆盖整个屏幕。 我为视图使用的约束很简单:

view.addsubView(blackView)

_ = blackview.anchor(view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, topConstant: 0, leftConstant: 0, bottomConstant: 0, rightConstant: 0, widthConstant: 0, heightConstant: 0)

弹出window是blackView的子视图:

blackView.addSubview(reminderPopUpView) 

我该怎么做?

您可以简单地将黑色视图添加为 window 子视图。

UIApplication.shared.keyWindow?.addSubview(blackView)

将您的视图添加到 window 的子视图,如下所示:

let mainWindow = UIApplication.sharedApplication().keyWindow!
let overlayview = UIView(frame: CGRect(x: mainWindow.frame.origin.x, y: mainWindow.frame.origin.y, width: mainWindow.frame.width, height: mainWindow.frame.height))
mainWindow.addSubview(overlayview);

您可以根据需要调整其背景颜色和透明度。

按照以下步骤解决您的问题:

1> 用你想要覆盖的插座创建你的 UIView 让我们称之为 viewOverLay

2> 使用下面的代码覆盖该视图以覆盖整个屏幕甚至导航栏

self.navigationController?.view.addSubview(self.viewOverLay) 
self.viewOverLay.frame.size.height = (self.navigationController?.view.bounds.height)! 
self.viewOverLay.alpha = 0.0

3>想展示的时候

UIView.animate(withDuration: 0.3) { self.viewOverLay.alpha = 1.0 } 

4>想隐藏的时候

UIView.animate(withDuration: 0.3) { self.viewOverLay.alpha = 0.0 }

请告诉我它是否适合你。

在我的例子中,使用自动布局在新的 UIViewController 上绘制 popupView 更容易,然后我用全屏淡入显示它:

if let popupVC = UIStoryboard(name: "Popup", bundle: nil).instantiateViewController(withIdentifier: "PopupVC") as? PopupVC {
        popupVC.parentVC = self
        popupVC.modalPresentationStyle = UIModalPresentationStyle.custom
        popupVC.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
        present(popupVC, animated: true, completion: nil)
}

在行 popupVC.parentVC = self 中,我将当前的 UIViewController(称为 parentVC)传递给 popupVC。这样,当 popupVC 被取消时,我可以将数据传回给它的父对象。 使用委托也可以做到这一点,这取决于解耦对你来说有多大价值。