在 iOS8 中使用 clipsToBounds = YES 时,状态栏完全变黑。我该如何改变?

Posted

技术标签:

【中文标题】在 iOS8 中使用 clipsToBounds = YES 时,状态栏完全变黑。我该如何改变?【英文标题】:Status Bar turning completely black when using clipsToBounds = YES in iOS8. How do I change this? 【发布时间】:2015-07-23 12:51:39 【问题描述】:

我通过 AppDelegate 中的 UINavigationBar 外观代理将 NavigationBar 的半透明属性设置为 NO。

然后,为了摆脱 UINavigationBar 和它下方的视图之间的 1 像素高度分隔符,在我的 ViewController 中,我设置了 self.navigationcontroller.navigationbar.clipsToBounds = YES;

这是去掉分隔符,达到类似这样的效果...

在 UINavigationBar 下方还有一个带日期的附加视图。

但是,当我开始使用 clipsToBounds = YES 时,我的状态栏完全变黑。我不想要这个。我希望它是“蓝色的”,就像在这个 CBS Sports 应用程序的照片中一样。

如何更改状态栏的颜色,或者为什么我的导航栏颜色不再延伸到状态栏? [另外,我使用的是嵌入式 NavigationController,而不是拖到视图中的]

【问题讨论】:

【参考方案1】:

不要将clipsToBounds 属性设置为YES。扩展条的工作方式是将图层绘制到其边界之外,直到状态栏下方。

这里有两个选择。一种是使用运行时技巧来删除分隔符,我已经在this answer 中解释了如何做到这一点。

由于你的案例不涉及半透明导航栏,所以会简单很多。你要设置的是 shadowImage 像这样为空:

self.navigationController.navigationBar.shadowImage = [UIImage new];

但您会注意到这并不能立即生效。文档提到,在没有使用setBackgroundImage: 方法之一设置背景图像之前,这将不起作用。由于您的条形图不是半透明且具有单一颜色,因此您可以使用该颜色创建一个 1x1px 宽的图像,并将其设置为背景图像。

【讨论】:

我刚刚意识到一个潜在的问题。所以我有一个 1x1px 的图像,我的应用程序默认导航颜色。但是,我允许我的用户在应用程序中选择多个颜色主题。它们可以从蓝色变为红色,再到橙色和许多其他颜色。我用他们的面具改变一切,包括图像。如果我必须将 1x1px 宽的图像设为静态颜色,此解决方案是否会阻止我这样做? 否,因为您可以创建带有颜色的图像。我认为我的其他解决方案对您来说会更好。看看我的链接。 好的,所以我只需要将 uiimageview 隐藏为隐藏?它是导航栏的子视图吗?所以我只是迭代 nab bar children 来找到它? @chrisP 我的回答对你有帮助吗?【参考方案2】:

这里的一个问题是,当您将clipsToBounds 设置为true 时,您会丢失状态栏的顶部。因此,我所做的与您所做的正好相反——我让导航栏绝对透明:

    self.navbar.backgroundColor = UIColor.clearColor()
    self.navbar.translucent = true
    self.navbar.setBackgroundImage(UIImage(), forBarMetrics:.Default)
    self.navbar.clipsToBounds = true

现在我们只是通过导航栏看到它背后的任何东西。因此,您可以将视图控制器视图的整个顶部区域设为蓝色,然后您就可以看到它。

【讨论】:

以上是关于在 iOS8 中使用 clipsToBounds = YES 时,状态栏完全变黑。我该如何改变?的主要内容,如果未能解决你的问题,请参考以下文章

将 UIView.layer.clipsToBounds = true 与 CABasicAnimation 结合使用时,并非所有像素都被裁剪

clipsToBounds 是如何工作的?

iOS7.x中clipsToBounds时UIToolBar失去半透明

clipsToBounds 导致 UIImage 在 iOS10 和 XCode 8 中不显示

clipsToBounds / maskToBounds 不适用于表格视图单元格中的图像视图?

NSView如何实现类似于UIView中的clipsToBounds功能(即不切割其SubView)