Ios 最重要的是添加UIView,甚至是导航栏

Ios 最重要的是添加UIView,甚至是导航栏,ios,uiviewcontroller,uinavigationbar,popupwindow,Ios,Uiviewcontroller,Uinavigationbar,Popupwindow,我想在任何其他视图上,甚至在导航栏上,显示一种“弹出”视图,如下所示: 带有0.5 alpha的全屏黑色背景,可以看到下面的另一个UIViewController 代码> UIVIEW/COD>窗口中有一些信息,(如果你想知道一切的日历) 为此,我创建了一个UIViewController,其中包含两个UIView(背景和窗口),并试图显示它。我尝试了一个简单的[mySuperVC addSubview:myPopUpVC.view],但我仍然有上面的导航栏 我试图将其表示为模态,但下面的U

我想在任何其他视图上,甚至在导航栏上,显示一种“弹出”视图,如下所示:

  • 带有0.5 alpha的全屏黑色背景,可以看到下面的另一个
    UIViewController
  • 代码> UIVIEW/COD>窗口中有一些信息,(如果你想知道一切的日历)
为此,我创建了一个UIViewController,其中包含两个
UIView
(背景和窗口),并试图显示它。我尝试了一个简单的
[mySuperVC addSubview:myPopUpVC.view]
,但我仍然有上面的导航栏

我试图将其表示为模态,但下面的
UIViewController
消失了,我失去了透明度效果

如果你有什么想法,我相信这很简单


谢谢

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

UIView *myView = /* <- Your custom view */;
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
[currentWindow addSubview:myView];
iOS13及以上版本的更新

let currentWindow: UIWindow? = UIApplication.shared.keyWindow
currentWindow?.addSubview(myView)
keyWindow
已弃用。您应该使用以下选项:

UIApplication.shared.windows.first(其中:{$0.isKeyWindow})?.addSubview(myView)

我建议您创建一个新的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中管理视图。 要删除窗口,请执行以下操作:

[window removeFromSuperview];
window = nil;

希望这会有帮助

将您的视图添加为NavigationController的子视图

[self.navigationController.navigationBar addSubview: overlayView)]
您还可以将其添加到窗口上:

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

希望这有帮助:)

[self.navigationController.view addSubview:overlyview]是您真正想要的

有多种方法:

1-在
ui窗口
上添加
ui视图
,而不是在
ui视图控制器
上添加它。这样,它将是最重要的

   [[(AppDelegate *)[UIApplication sharedApplication].delegate window] addSubview:view];
let myView = MyView()
myView.frame = UIScreen.main.bounds

guard let textEffectsWindow = NSClassFromString("UITextEffectsWindow") else { return }
let window = UIApplication.shared.windows.first { window in
    window.isKind(of: textEffectsWindow)
}
window?.rootViewController?.view.addSubview(myView)
2-使用自定义转换,使UIViewController以0.5 alpha显示在后面


为此,我建议您查看以下内容:

Dalef swift中的伟大解决方案:

self.navigationController?.view.addSubview(view)

这里有一个简单而优雅的解决方案,对我来说很有效。可以将导航栏的z位置设置为视图下方:

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

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

我将使用包含“容器视图”的UIViewController子类,该视图嵌入其他视图控制器。 然后,您将能够在容器视图中添加导航控制器(例如使用嵌入关系segue)


有关选中的响应,请参见Swift版本:

Swift 4:

let view = UIView()
view.frame = UIApplication.shared.keyWindow!.frame
UIApplication.shared.keyWindow!.addSubview(view)
let view = UIView()
view.frame = UIApplication.sharedApplication().keyWindow!.frame 
UIApplication.sharedApplication().keyWindow!.addSubview(view)
Swift 3.1:

let view = UIView()
view.frame = UIApplication.shared.keyWindow!.frame
UIApplication.shared.keyWindow!.addSubview(view)
let view = UIView()
view.frame = UIApplication.sharedApplication().keyWindow!.frame 
UIApplication.sharedApplication().keyWindow!.addSubview(view)

@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
}
不要忘记窗口必须是一个强属性,因为最初的答案会导致立即释放窗口

[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];

注意:如果要全屏添加视图,请仅使用以下代码

let currentWindow: UIWindow? = UIApplication.shared.keyWindow
currentWindow?.addSubview(myView)
添加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的ViewDidDisplay

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

     self.makeViewAsFullScreen()
}

此方法适用于xcode 9.4、iOS 11.4

@Nam的答案非常适用于只想显示自定义视图的用户交互,但如果自定义视图需要用户交互,则需要禁用导航栏的交互

self.navigationController.navigationBar.layer.zPosition = -1
self.navigationController.navigationBar.isUserInteractionEnabled = false
正如Nam在回答中所说,不要忘记扭转这些变化:

self.navigationController.navigationBar.layer.zPosition = 0
self.navigationController.navigationBar.isUserInteractionEnabled = true

您可以通过扩展以更好的方式执行此操作:

extension UINavigationBar {
    func toggle() {
        if self.layer.zPosition == -1 {
            self.layer.zPosition = 0
            self.isUserInteractionEnabled = true
        } else {
            self.layer.zPosition = -1
            self.isUserInteractionEnabled = false
        }
    }
}
只需这样使用它:

self.navigationController.navigationBar.toggle()

在Swift 4.2和Xcode 10中

var spinnerView: UIView? //This is your view

spinnerView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))
//Based on your requirement change width and height like self.view.bounds.size.width
spinnerView?.backgroundColor = UIColor.black.withAlphaComponent(0.6)
//        self.view.addSubview(spinnerView)
let currentWindow: UIWindow? = UIApplication.shared.keyWindow
currentWindow?.addSubview(spinnerView!)
目标C中

UIView*spinnerView//这是你的观点

self.spinnerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height)];  
//Based on your requirement change width and height like self.view.bounds.size.width
self.spinnerView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
// [self.view addSubview:self.spinnerView];
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
[currentWindow addSubview:self.spinnerView];
这可以在纵向或横向模式下工作

另一个简单的代码是:

yourViewName.layer.zPosition = 1//Change your view name

您需要将子视图添加到第一个UITextEffectsWindow类型的窗口中。首先,因为自定义键盘添加了UITextEffectsWindow,如果向其中添加子视图,则无法正常工作。 此外,您不能将子视图添加到最后一个窗口,因为例如,键盘也是一个窗口,您不能从键盘窗口显示。 因此,我找到的最佳解决方案是将子视图(甚至是推送视图控制器)添加到第一个UITextEffectsWindow类型的窗口中,此窗口包含附件视图、导航栏-所有内容

   [[(AppDelegate *)[UIApplication sharedApplication].delegate window] addSubview:view];
let myView = MyView()
myView.frame = UIScreen.main.bounds

guard let textEffectsWindow = NSClassFromString("UITextEffectsWindow") else { return }
let window = UIApplication.shared.windows.first { window in
    window.isKind(of: textEffectsWindow)
}
window?.rootViewController?.view.addSubview(myView)

在应用程序窗口中添加子视图。处理方向更改可能很棘手:谢谢:)不幸的是,如果您处于横向模式,则需要旋转视图。我不知道该怎么做。是的,我只在横向模式下,我的视图显示为90度旋转。这似乎就是他们在这里所说的:方向问题发生在iOS8之前的设备上,很遗憾,对于这些设备,此解决方案不起作用。@NicolasRoy Autolayout会有帮助它不包括选项卡栏。有什么解决方案吗?谢谢,但我认为缺少了一些东西,因为没有显示任何内容:/n您需要将框架设置为非常好的解决方案,特别是当您将视图添加为“子视图控制器”时,这不适用于子视图控制器的视图。更改导航栏的z级(正如Nam所建议的)也适用于子视图控制器。它看起来比将视图添加到关键窗口更优雅。由于这确保添加了视图,因此将沿基础视图的动画移动。因为如果在关键点窗口中添加视图,它不会附带动画,如果你想关闭控制器,它必须单独删除。它不会过度弹出,但对于我的情况来说,它是正确的。这比将覆盖视图作为子视图添加到导航控制器的视图(顺便说一句,这会导致崩溃)要好得多。这种z位置的解决方案可能更可靠,并且在将来造成的问题更少。这在使用故事板时非常有效。您可以在情节提要中添加视图!对我来说也很好。最好能提到zPosition应该设置回值0(您只需提到在完成时应该设置回值)。我的屏幕上也有tabBar(来自TabBarController)。我试图设置zPosition,但当返回到0值tabBar时