【问题标题】:I want a UIView to cover the whole screen even navigationbar but show its subviews我希望 UIView 覆盖整个屏幕甚至导航栏,但显示其子视图
【发布时间】:2018-06-22 15:41:39
【问题描述】:

如何让 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)

弹出的窗口是blackView的一个子视图:

blackView.addSubview(reminderPopUpView) 

我该怎么做?

【问题讨论】:

  • 检查您的视图我认为您的视图不包含导航栏
  • 你完成了吗?

标签: ios iphone swift uiview screen


【解决方案1】:

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

UIApplication.shared.keyWindow?.addSubview(blackView)

【讨论】:

  • 我应该删除我为 blackView 设置的约束吗?
  • 不,他们没事。
  • keyWindow 在 iOS 14 中已弃用。请参阅 this SO link
【解决方案2】:

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

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 }

如果它适合你,请告诉我。

【讨论】:

  • 提示我 UIView 没有“高度”作为成员的错误
  • 请看更新的答案,我在第2步修改了代码
  • 非常感谢!它现在正在工作。我现在还有一个问题。由于我想在 viewOverLay 上显示的弹出框包含按钮,所以现在每当我按下这些按钮时,它们都没有响应。可能是什么问题?例如,当我按下“删除”或“完成”时 - 不会调用它们的处理函数。请帮忙!
  • 感谢,对于新问题,请检查您的视图层次结构,它将与 1> 使用 IBOUTLET 覆盖您的 BlackView 2> 在 BlackView 中添加您的提醒PopUpView 视图,然后它肯定会工作。另外,请将答案标记为已选择,因为它目前似乎有效!
  • 视图层次结构正确。我在 BlackView 上添加了一个点击手势识别器来关闭 popupview 和 blackview。即使点击弹出视图,该手势似乎也有效,但弹出视图中的日期选择器似乎工作得很好。我感到困惑和沮丧。
【解决方案3】:

在我的例子中,使用自动布局在新的 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 被解除时,我可以将数据传回其父级。 使用委托也可以做到这一点,这取决于解耦对您来说价值多少。

【讨论】:

  • 使用 UIModalPresentationStyle.overFullScreen 而不是 .custom 也对我有用
【解决方案4】:

将您的视图添加到窗口的子视图中,如下所示:

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);

您可以根据自己的要求调整其背景颜色和 alpha。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    相关资源
    最近更新 更多