我想在任何其他视图,甚至是导航栏上,显示一种“弹出”视图,看起来像这样:
全屏黑色背景,0.5 alpha,可以看到下面的另一个UIViewController。
中间有一个带有一些信息的UIView窗口,(如果你想知道一切,一个日历)。
为了做到这一点,我已经创建了一个UIViewController,它包含了两个uiview (background和window),我试图显示它。我尝试了一个简单的[mySuperVC addSubview:myPopUpVC。视图],但我仍然有上面的导航栏。
我试着把它表示为一个模态,但是下面的UIViewController消失了,我失去了透明效果。
有什么办法可以做到这一点吗,我相信这很简单……
谢谢!
你可以通过将你的视图直接添加到keyWindow来实现:
UIView *myView = /* <- Your custom view */;
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
[currentWindow addSubview:myView];
更新—适用于Swift 4.1及以上
let currentWindow: UIWindow? = UIApplication.shared.keyWindow
currentWindow?.addSubview(myView)
iOS13及以上更新
已弃用keyWindow。你应该使用以下方法:
UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.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的viewDidAppear
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.makeViewAsFullScreen()
}
@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!)
在Objective C中
这是你的视图
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
You need to add a subview to the first window with the UITextEffectsWindow type. To the first, because custom keyboards add their UITextEffectsWindow, and if you add a subview to it this won't work correctly.
Also, you cannot add a subview to the last window because the keyboard, for example, is also a window and you can`t present from the keyboard window.
So the best solution I found is to add subview (or even push view controller) to the first window with UITextEffectsWindow type, this window covers accessory view, navbar - everything.
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)