如何添加覆盖所有其他视图(包括导航栏和状态栏)的暗屏?

Posted

技术标签:

【中文标题】如何添加覆盖所有其他视图(包括导航栏和状态栏)的暗屏?【英文标题】:How do I add a dark screen that covers all other views (including navigation bar and status bar)? 【发布时间】:2013-11-04 21:25:52 【问题描述】:

我想在我的所有视图上添加一个黑屏,然后在其上方显示一个通知窗口,就像在 Tweetbot 3 中一样:

但是,我不完全确定这是如何实现的。

添加一个以屏幕大小为框架的暗视图不起作用,如下:(导航栏和状态栏没有被覆盖)

UIView *darkOverlay = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
darkOverlay.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];
[self.view insertSubview:darkOverlay behindSubview:self.view];

这涵盖了除了状态栏之外的所有内容(所以它非常接近,但由于我的状态栏内容很轻,它仍然非常刺耳):

[[[UIApplication sharedApplication] keyWindow] addSubview:darkOverlay];

那么这样的事情是如何完成的呢?

【问题讨论】:

你好像已经问过这个问题了:How do I fade/dim the background of my app while keeping a few in the front normal?请不要转发。 这是一个不同的问题。那里的答案满足了我的需要,但我现在意识到视图可能会有一个导航栏,所以需求是不同的。 重读后也看不出区别。 能够在导航栏上添加视图与回答者和接受者的解释截然不同。这些解决方案有效,但不适用于需要覆盖导航栏的情况。 如果你被误解了,你可以编辑你之前的问题,如果它不能真正解决你的问题,你不必接受。 【参考方案1】:

你可以试试这个方法

    UIWindow* window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    window.windowLevel = UIWindowLevelAlert;
    window.opaque = NO;

    [window addSubview:someView];

    // window has to be un-hidden on the main thread
    [window makeKeyAndVisible];

“视图”在哪里 - 是您的自定义弹出窗口。

【讨论】:

【参考方案2】:

你必须这样做:

CGRect screenRect = [[UIScreen mainScreen] bounds];
_darkCoverView = [[UIView alloc] initWithFrame:screenRect];
_darkCoverView.backgroundColor = [UIColor blackColor];
_darkCoverView.alpha = 0.5;

[[[[UIApplication sharedApplication] delegate] window] addSubview:_darkCoverView];

它对我有用,状态栏也被覆盖了:)

【讨论】:

【参考方案3】:

您可以尝试简单地以模态方式呈现它,因为模态视图控制器位于导航控制器之上。

TransparancyViewController *vc=[[TransparancyViewController alloc]initWithNibName:@"TransparancyViewController" bundle:nil] ;
vc.view.backgroundColor = [UIColor clearColor];
navController.view.alpha = 0.3;
navController.modalPresentationStyle = UIModalPresentationCurrentContext;
[navController presentViewController:vc animated:NO completion:nil];

用于情节提要的小示例项目..http://cl.ly/442C11341k2G

【讨论】:

虽然这可行,但我使用它的方式有点类似于 Tweetbot 在上面的屏幕截图中所做的,所以随机消失的导航栏看起来很奇怪。 如何以模态方式呈现它们?模态视图位于导航栏上方 在上面的代码中,透明笔尖只有你想要显示的“警报视图” 可以不用笔尖吗?我在这个项目中做错了什么? cl.ly/3f2Y0P3j1x0C 我想如果你能包含一个小示例项目,那就太好了。 你项目中的navigationController是nil,因为你没有在storyboard中初始化一个。【参考方案4】:

当您创建 darkOverlayView 时,最好指定视图的实际边界,它应该填满整个屏幕(使用 iPhone 5 的宽度、高度)。

UIView *darkOverlay = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320, 568)];

如果你的通知对象也是一个 UIView,把它放在前面。

[self.view addSubView:darkOvelay]
[self.view bringSubviewToFront:notificationView];

我希望这能解决你的问题,干杯,吉姆。

【讨论】:

我确实使用了正在使用的设备的边界,这就是[UIScreen mainScreen] 部分的作用。而且这个解决方案并没有覆盖所有的子视图,它只是在 View Controller 的视图中添加了一个更暗的视图。 对不起,它从来没有奏效。您是否只需要在背景中添加一个填充整个屏幕的较暗视图(例如 UIAlertview 会发生什么?)。如果是这样,我通常会创建一个单独的 xib 和 class 文件来使用。祝你好运。 那也覆盖了状态栏? 是的,如果您正确设置背景颜色(alphas),并将其配置为隐藏状态栏,它应该可以工作。在下面查看我经过审核的答案。

以上是关于如何添加覆盖所有其他视图(包括导航栏和状态栏)的暗屏?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 swift 在子视图中添加标签栏和导航栏?

iOS 状态栏和导航栏颜色相同

系统覆盖不覆盖状态栏和导航栏 Android

在状态栏和导航栏之间添加图片

在 UITabBarController 中的标签栏和导航视图之间添加 UIView

关闭模态视图后的状态栏和导航栏问题