首先添加一个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];