iOS 7 状态栏透明

Posted

技术标签:

【中文标题】iOS 7 状态栏透明【英文标题】:iOS 7 status bar transparent 【发布时间】:2013-08-14 12:26:39 【问题描述】:

在情节提要中,在视图控制器中,我尝试在状态栏下添加导航栏,运行它,它是透明的并显示应该模糊的标签,例如导航栏。

但是当将同一个视图控制器嵌入到导航视图控制器中时,下面的背景图像可能会变得模糊,这是我的意图。

这两种方式不同的结果是什么?第一种方法使状态栏模糊需要做什么?

谢谢!

【问题讨论】:

@Caleb 见meta.stackexchange.com/questions/94465/… @Caleb - 另外,我对 NDA 和 Stack Overflow 的看法可以在 Meta 上的这个答案中找到:meta.stackexchange.com/questions/184625/… @BradLarson 也许我应该花一些时间来回复您的元线程,而不是在这里做。简而言之,我们有关闭违反 ios NDA 的问题的历史,我认为至少用评论标记这些问题很重要。如果您告诉我您的立场是所有 SO 版主或 SE 的立场,我不介意在此基础上不投票结束。 OTOH,结束无法回答的问题具有明显的价值。 现在我们可以开始讨论了吧? FWIW 我遇到了同样的问题,我的层次结构类似于 Nav Controller > View Controller > Table view。如果我隐藏导航栏,我会看到透明的状态栏,如果导航栏没有隐藏,一切都很好。除此之外没有取得太大进展。 【参考方案1】:

在 iOS 7 中,状态栏默认是透明的。当还有一个导航栏时,您看到的模糊实际上是由导航栏创建的。因此,要在没有导航栏的情况下创建您想要的效果,您需要在状态栏下方放置一个产生模糊效果的视图。

作为参考,使用以下提供的框架添加您的视图:

CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];

【讨论】:

您好,感谢您的提示。但我不知道如何继续你的。你能说更多吗? 让我尝试改写一下以防万一:在 iOS 中,状态栏是透明的,默认情况下视图控制器会占据全屏。所以这是一个很大的变化,我自己花了一点时间来适应它(希望我在这里没有错,我刚刚使用 iOS 7 几周了)。所以你只需要在状态栏下方放置一个你想要的颜色的视图。导航控制器栏为您执行此操作,当您没有导航栏时,您必须自己做。是不是更清楚了? 那如何让状态栏在制作框架后变成半透明呢? 这个解决方案最适合我。对于那些想知道的人,我创建了一个具有纯色背景颜色的 UIView(您可以使用 alpha 使其半透明),并将此视图添加到我的 navigationController 的视图中([self.navigationController.view addSubview:customStatusBar])【参考方案2】:

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

【讨论】:

【参考方案3】:

我还没有完全测试过,但是请转到您的 plist 文件并检查以下设置:

“基于视图控制器的状态栏外观”:如果设置为“是”,那么它应该显示每个视图控制器唯一的状态栏,这可能是您需要的。

“状态栏样式”:可以设置为三种不同的样式:不透明黑色、灰色和透明黑色。

如果这对你有用,请告诉我。

【讨论】:

【参考方案4】:

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

看起来您在第一个示例中从点 (0,20) 开始定位视图层次结构。另外,那是 UIToolbar 还是 UINavigationBar?如果是后者,为什么要单独使用而不是在 UINavigationController 内部使用?

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

详细解释请参阅this answer。

【讨论】:

【参考方案5】:

我有类似的 UI 设计,基于 Matt Hall answer 和 some article 我用谷歌搜索过,我想出了这样的东西:

- (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 指向故事板中添加的导航栏。仅当它在 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);
  


我找到了另一个解决方案,我认为这是最好的,因为它只涉及故事板,不需要任何代码。
    将故事板视图切换到 6.1 模式(查看方式:iOS 6.1 及更早版本) 选择有问题的UINavigationBar 在大小部分添加20“iOS6/7 Deltas”中的增量高度 将视图切换回 7.0 模式(查看为:iOS 7.0 及更高版本),并对结果感到满意。

【讨论】:

【参考方案6】:

当您使用导航视图控制器嵌入视图控制器时,您将看到导航栏到您从同一视图控制器推送到的所有视图控制器。在您的第一种情况下,您正在添加导航栏对象,您可以从中选择视图控制器 storyboard ,转到属性检查器选项卡并从他们的选择顶部栏作为半透明导航栏。

【讨论】:

以上是关于iOS 7 状态栏透明的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7状态栏半透明,具有向后兼容性

UISplitViewController - 状态栏颜色,iOS 7

在iOS 7中隐藏导航栏时,如何更改状态栏的颜色?

如何在 iOS 7 上更改状态栏背景颜色和文本颜色?

让导航栏与iOS 7中的状态栏重叠

如何在iOS 7上更改状态栏背景颜色和文本颜色? Warif Akhand Rishi