14

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

在此处输入图像描述

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

在此处输入图像描述

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

谢谢!

4

6 回答 6

4

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

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

CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
于 2013-09-12T03:14:40.553 回答
3

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

于 2014-08-08T03:15:59.770 回答
2

我还没有完全测试这个,但去你的 plist 文件并检查以下设置:

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

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

让我知道这是否对您有用。

于 2013-09-16T13:15:18.883 回答
1

我有类似的 UI 设计,基于Matt Hall 的回答和我在谷歌上搜索的一些文章,我想出了这样的东西:

- (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);
  }
}


我找到了另一个我认为最好的解决方案,因为它只涉及情节提要,不需要代码。

  1. 将情节提要视图切换到 6.1 模式(查看方式:iOS 6.1 和更早版本)更改查看模式
  2. 选择有问题的UINavigationBar
  3. 20在“iOS6/7 Deltas”中的尺寸部分添加增量高度导航栏的正确大小
  4. 将视图切换回 7.0 模式(查看为:iOS 7.0 及更高版本),并对结果感到满意。
于 2014-01-31T15:18:27.850 回答
1

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

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

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

有关详细说明,请参阅此答案

于 2013-09-17T17:26:42.973 回答
0

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

于 2015-07-17T11:36:21.193 回答