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

Nic*_*Roy 174 uinavigationbar popupwindow uiviewcontroller ios

我希望在任何其他视图之上显示甚至导航栏,这是一种看起来像这样的"弹出"视图:

  • 全屏黑色背景,0.5阿尔法,以查看UIViewController下面的其他.
  • UIView中间的窗口有一些信息,(如果你想知道一切,日历).

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

我试图将它作为模态呈现,但是UIViewController底层消失了,我失去了透明效果.

任何想法,我相信这很简单......

谢谢!

Rom*_*om. 188

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

UIView *myView = /* <- Your custom view */;
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
[currentWindow addSubview:myView];
Run Code Online (Sandbox Code Playgroud)

  • 它不包括标签栏.任何解决方案? (4认同)
  • 谢谢:)不幸的是,如果你处于横向模式,你需要旋转视图.我不确定我是否知道如何正确地做到这一点. (2认同)

dal*_*lef 128

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

  • 你需要设置框架 (5认同)
  • 这不适用于子视图控制器的视图.更改导航栏的z级别(如Nam所示)也适用于子视图控制器. (2认同)

Nam*_*Nam 104

这是一个适合我的简单优雅的解决方案.您可以将导航栏的z位置设置为视图下方:

self.navigationController.navigationBar.layer.zPosition = -1;
Run Code Online (Sandbox Code Playgroud)

记得在完成后将其设置为0.


Kev*_*OUX 58

检查响应的Swift版本:

斯威夫特4:

let view = UIView()
view.frame = UIApplication.shared.keyWindow!.frame
UIApplication.shared.keyWindow!.addSubview(view)
Run Code Online (Sandbox Code Playgroud)

Swift 3.1:

let view = UIView()
view.frame = UIApplication.sharedApplication().keyWindow!.frame 
UIApplication.sharedApplication().keyWindow!.addSubview(view)
Run Code Online (Sandbox Code Playgroud)

  • 我可以覆盖所有当前视图(视图控制器),但是在其上方显示新出现的视图控制器吗? (6认同)

Ras*_*had 22

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

[self.navigationController.navigationBar addSubview: overlayView)]
Run Code Online (Sandbox Code Playgroud)

您也可以在窗口上添加它:

UIView *view = /* Your custom view */;
UIWindow *window = [UIApplication sharedApplication].keyWindow;
[window addSubview:view];
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.. :)


All*_*ome 20

Dalef在swift中的出色解决方案:

self.navigationController?.view.addSubview(view)
Run Code Online (Sandbox Code Playgroud)


小智 8

Swift版@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
}
Run Code Online (Sandbox Code Playgroud)

不要忘记窗口必须是强大的属性,因为原始答案会导致窗口立即释放


Nic*_*net 6

我建议你创建一个新的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];
Run Code Online (Sandbox Code Playgroud)

然后,您可以在其他UIViewController中管理您的视图.要删除窗口:

[window removeFromSuperview];
window = nil;
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!

  • 谢谢,但我觉得有些东西丢失了,因为什么都没有出现:/ (3认同)

Dan*_*i A 6

有多种方法可以做到:

1-添加您UIView的电话UIWindow而不是添加它UIViewController.这样它就会成为一切.

   [[(AppDelegate *)[UIApplication sharedApplication].delegate window] addSubview:view];
Run Code Online (Sandbox Code Playgroud)

2-使用自定义转换,使你的UIViewController在后面显示0.5 alpha

为此,我建议你看看:https://github.com/Citrrus/BlurryModalSegue


Hem*_*ang 6

如果您只想显示自定义视图,则navigationBar @Nam的答案非常有用,但是如果您的自定义视图需要用户交互,则需要禁用的交互

self.navigationController.navigationBar.layer.zPosition = -1
self.navigationController.navigationBar.isUserInteractionEnabled = false
Run Code Online (Sandbox Code Playgroud)

就像Nam的回答中所说的,不要忘记扭转这些变化:

self.navigationController.navigationBar.layer.zPosition = 0
self.navigationController.navigationBar.isUserInteractionEnabled = true
Run Code Online (Sandbox Code Playgroud)


您可以通过扩展更好地做到这一点:

extension UINavigationBar {
    func toggle() {
        if self.layer.zPosition == -1 {
            self.layer.zPosition = 0
            self.isUserInteractionEnabled = true
        } else {
            self.layer.zPosition = -1
            self.isUserInteractionEnabled = false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样简单地使用它:

self.navigationController.navigationBar.toggle()
Run Code Online (Sandbox Code Playgroud)