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
(背景和窗口),并试图显示它。我尝试了一个简单的[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时