iOS 7状态栏透明化

14
在Storyboard中,我尝试在一个视图控制器中添加一个导航栏来覆盖状态栏,在运行时,它是透明的,并显示了一个应该被模糊处理的标签,就像导航栏一样。
但是,当将同一个视图控制器嵌入到导航视图控制器中时,下方的背景图像可以被模糊处理,这也是我的意图。
为什么会出现这两种不同的结果?如何使第一种方法中的状态栏变得模糊?
谢谢!

1
@Caleb 请查看http://meta.stackexchange.com/questions/94465/should-moderators-enforce-ndas-for-software-vendors - Paul Peelen
2
@Caleb - 另外,我对于NDA和Stack Overflow的想法可以在Meta上的这个回答中找到:http://meta.stackexchange.com/questions/184625/why-is-there-an-ios-7-tag/184635#184635 - Brad Larson
@BradLarson 或许我应该抽出时间在你的元帖中回复,而不是在这里回复。简单来说,我们有关闭违反 iOS NDA 的问题的历史,我认为至少应该用评论标记此类问题。如果你告诉我你的立场是所有 SO 版主或 SE 总体的立场,我不介意根据此基础不投票关闭。另一方面,关闭无法回答的问题确实具有明显的价值。 - Caleb
2
现在我们可以开始讨论了,对吧? - S1U
就我个人而言,我也遇到了同样的问题,我的层次结构是Nav控制器>视图控制器>表视图。如果我隐藏导航栏,我会看到透明的状态栏,如果导航栏没有隐藏,一切都正常。除此之外,我还没有取得什么进展。 - Matt Hall
6个回答

4
在iOS 7中,状态栏默认是透明的。当有导航栏时,你看到的模糊效果实际上是由导航栏创建的。因此,如果想在没有导航栏的情况下创建所需的效果,则需要将产生模糊效果的视图放置在状态栏下方。
添加参考视图时,请使用提供的框架:
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];

嗨,谢谢您的提示。但是我不确定如何按照您的建议继续。您能再多解释一下吗? - S1U
让我试着换一种说法,iOS中状态栏是透明的,默认情况下视图控制器占据整个屏幕。这是一个很大的变化,我自己也需要一点时间来适应它(希望我没有理解错,我只是使用iOS 7工作了几周)。所以你只需要在状态栏下面放置一个视图,用任何颜色都可以。当你没有导航栏时,导航控制器栏会为你完成这项工作,否则你就必须自己动手。这样清楚了吗? - Matt Hall
那么在制作一个框架之后,如何使状态栏变为半透明的呢? - Kyle Xie
1
这个解决方案对我来说效果最好。对于那些想知道的人,我创建了一个带有纯色背景的UIView(您可以使用alpha使其半透明),并将此视图添加到我的navigationController的视图中([self.navigationController.view addSubview:customStatusBar])。 - LilDwarf

3

我知道这是旧内容,仅供参考,我通过设置self.navigationController.navigationBar.clipToBounds = NO来解决了这个问题。


2

我还没有完全测试过这个方法,但是请打开您的plist文件并检查以下设置:

"View controller-based status bar appearance":如果设置为"Yes",则应该显示一个独特于每个视图控制器的状态栏,这可能是您需要的。

"Status bar style":您可以将其设置为三种不同的样式:不透明黑色、灰色和透明黑色。

如果这个方法对您有用,请告诉我。


1

我有一个类似的UI设计,基于Matt Hall answer一些文章 我在谷歌上搜索后得出了以下内容:

- (void)viewDidLoad {
  [super viewDidLoad];

  if (NSFoundationVersionNumber>NSFoundationVersionNumber_iOS_6_1) {
    CGRect statusBarFrame = [self.view convertRect: [UIApplication sharedApplication].statusBarFrame fromView: nil];
    UIToolbar *statusBarBackground = [[UIToolbar alloc] initWithFrame: statusBarFrame];
    statusBarBackground.barStyle = self.navBar.barStyle;
    statusBarBackground.translucent = self.navBar.translucent;
    statusBarBackground.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth;
    [self.view addSubview: statusBarBackground];
  }
}

self.navBar指向在storyboard中添加的导航栏。只有在运行于iOS7时才需要这样做,这就是为什么我添加了这个条件(我的应用程序必须支持iOS5)。

这个方法非常有效。


另一种方法(强制状态栏大小)也很好:

- (void)viewDidLoad {
  [super viewDidLoad];

  if (NSFoundationVersionNumber>NSFoundationVersionNumber_iOS_6_1) {
    CGRect statusBarFrame = [self.view convertRect: [UIApplication sharedApplication].statusBarFrame fromView: nil];
    self.navBar.frame = CGRectUnion(statusBarFrame, self.navBar.frame);
  }
}


我找到了另一种解决方案,我认为这是最好的,因为它只涉及故事板,不需要编写代码。

  1. 将故事板视图切换到6.1模式(视图:iOS 6.1及更早版本)change view mode
  2. 选择有问题的UINavigationBar
  3. 在大小部分中,在“iOS6/7 Deltas”中添加20个增量高度correct size of navigation bar
  4. 将视图切换回7.0模式(视图:iOS 7.0及更高版本),并且结果很令人满意。

1

UINavigationController将根据一组奇怪而未记录的约束条件来更改其UINavigationBar的高度,高度将为44个点或64个点。如果UINavigationController检测到其视图框架的顶部与其UIWindow的顶部在视觉上连续,则会使用高度为64个点的导航栏进行绘制。如果其视图的顶部与UIWindow的顶部不连续(即使只差一个点),则会以“传统”方式绘制其高度为44个点的导航栏。即使它是应用程序的视图控制器层次结构中的几个子级,UINavigationController也会执行此逻辑。无法阻止此行为。

在第一个示例中,看起来您正在将视图层次结构定位在点(0,20)处。此外,那是UIToolbar还是UINavigationBar?如果是后者,请问为什么要单独使用它而不是在UINavigationController中使用它?

如果您不使用UINavigationController,而是使用自定义视图控制器容器,则需要相应地定位您的视图。

请参见this answer以获取详细说明。


0

当您使用导航视图控制器嵌入视图控制器时,您将在从同一视图控制器推送到的所有视图控制器中看到导航栏。 在您的第一个案例中,您正在添加导航栏对象,而不是这样做,您可以从故事板中选择视图控制器,转到属性检查器选项卡,然后从中选择顶部栏作为半透明导航栏。 enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接