首先添加一个UIView,甚至导航栏

我想在任何其他视图之上显示导航栏,这是一种类似于这样的“popup式”视图:

  • 用0.5 alpha的全屏幕黑色背景看下面的其他UIViewController
  • 一个UIView窗口中间有一些信息,(一个日历,如果你想知道一切)。

为此,我创build了一个包含两个UIViews (背景和窗口)的UIViewController,并试图显示它。 我试过一个简单的[mySuperVC addSubview:myPopUpVC.view] ,但我仍然有上面的导航栏。

我试图把它作为模式呈现,但是下面的UIViewController消失了,我失去了透明效果。

任何想法做到这一点,我相信这是相当简单的…

谢谢!

你可以通过直接添加你的视图到keyWindow来实现:

 UIView *myView = /* <- Your custom view */; UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow; [currentWindow addSubview:myView]; 

[self.navigationController.view addSubview:overlayView]; 是你真正想要的

这是一个简单优雅的解决scheme,正在为我工​​作。 您可以将导航栏的z位置设置在视图下方:

 self.navigationController.navigationBar.layer.zPosition = -1; 

只要记住完成后将其设置回0。

添加您的视图作为NavigationController的子视图。

 [self.navigationController.navigationBar addSubview: overlayView)] 

您也可以将其添加到窗口中:

 UIView *view = /* Your custom view */; UIWindow *window = [UIApplication sharedApplication].keyWindow; [window addSubview:view]; 

希望这可以帮助.. :)

Swift版本的检查响应:

Swift 4:

 let newView = UIView() UIApplication.shared.keyWindow?.addSubview(newView) 

Swift 3.1:

 let newView = UIView() UIApplication.sharedApplication().keyWindow?.addSubview(newView) 

Dalef很好的解决scheme:

 self.navigationController?.view.addSubview(view) 

有多种方法可以做到这一点:

1-在UIWindow上添加你的UIView ,而不是在UIViewController上添加它。 这样,它将在一切之上。

  [[(AppDelegate *)[UIApplication sharedApplication].delegate window] addSubview:view]; 

2-使用自定义的过渡,将保持你的UIViewController在后面显示0.5 alpha

为此,我build议你看看这个: https : //github.com/Citrrus/BlurryModalSegue

我build议你创build一个新的UIWindow:

 UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; window.rootViewController = viewController; window.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; window.opaque = NO; window.windowLevel = UIWindowLevelCFShareCircle; window.backgroundColor = [UIColor clearColor]; [window makeKeyAndVisible]; 

然后你可以在其他UIViewController中pipe理你的视图。 要删除窗口:

 [window removeFromSuperview]; window = nil; 

希望能帮助!

@Nicolas Bonnet的快速版回答:

  var popupWindow: UIWindow? func showViewController(controller: UIViewController) { self.popupWindow = UIWindow(frame: UIScreen.mainScreen().bounds) controller.view.frame = self.popupWindow!.bounds self.popupWindow!.rootViewController = controller self.popupWindow!.makeKeyAndVisible() } func viewControllerDidRemove() { self.popupWindow?.removeFromSuperview() self.popupWindow = nil } 

不要忘记,窗口必须是一个强大的财产,因为原来的答案导致立即释放窗口

 [[UIApplication sharedApplication].windows.lastObject addSubview:myView]; 

我会使用一个UIViewController子类包含一个“容器视图”embedded你的其他视图控制器。 然后,您可以在Container View中添加导航控制器(例如,使用embedded关系segue)。

请参阅实施容器视图控制器

注意如果你想在全屏中添加视图,那么只能使用下面的代码

添加这些UIViewController的 扩展

 public extension UIViewController { internal func makeViewAsFullScreen() { var viewFrame:CGRect = self.view.frame if viewFrame.origin.y > 0 || viewFrame.origin.x > 0 { self.view.frame = UIScreen.main.bounds } } } 

继续正常的子视图添加过程

现在使用添加UIViewController的viewDidAppear

 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) self.makeViewAsFullScreen() } 
 [self.navigationController.navigationBar.layer setZPosition:-0.1]; UIView *view = [[UIView alloc]initWithFrame:CGRectMake(10, 20, 35, 35)]; [view setBackgroundColor:[UIColor redColor]]; [self.navigationController.view addSubview:view]; [self.navigationController.view bringSubviewToFront:view]; self.navigationController.view.clipsToBounds = NO; [self.navigationController.navigationBar.layer setZPosition:0.0]; 

在这里输入图像说明