iOS7:UINavigationBar 与状态栏合并

Posted

技术标签:

【中文标题】iOS7:UINavigationBar 与状态栏合并【英文标题】:iOS7: UINavigationBar merges with status bar 【发布时间】:2014-11-21 04:06:11 【问题描述】:

我是ios 的新手,我正在关注以下情况

我有一个UIViewController,其中有UITableViewUINavigationBar
@interface CategoryGroupViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>
@property (weak, nonatomic) IBOutlet UINavigationBar *navigationBar;
@property (strong, nonatomic) IBOutlet UITableView *tableView;
@end

XIB 中看起来像

当我运行我的应用程序时,它看起来像

我在网上看了下解决方案,也试过设置

self.edgesForExtendedLayout = UIRectEdgeNone;

但这似乎并不能解决问题。 有人可以指导我缺少什么吗?

谢谢

【问题讨论】:

如果您想使用默认导航栏,然后在 IB 上点击视图并将顶部栏设置为“不透明导航栏”。所以你会得到 64 px 的默认导航栏。但为此,您必须在窗口中使用 navigationcontroller 并添加 self.navigationController.navigationbarhidden=NO 如果您已经隐藏。无需在 IB 中使用 Navigatiobar。如果你想使用默认栏。 它没有做任何有用的事情。我仍然看到它正在合并 你能告诉我们你的流程是什么,比如“UIWindow > UINavigationController > UIViewController” 假设您有充分的理由不想使用嵌入在导航控制器中的默认导航栏?然后这一切都与您的约束有关。如果您想推出自己的酒吧,我可以发布解决方案? 您解决了这个问题吗? 【参考方案1】:

按照以下步骤将默认导航栏与 NavigationContoller 一起使用。

所以你的流程是 UIWindow > UINavigationController > UIViewController。

appDidFinishlaunching

self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainscreen].bounds];
self.vc = [[CategoryGroupViewController alloc]initWithNibName:@"CategoryGroupViewController" bundle:nil];
self.navC = [[UINavigationController alloc]initWithRootViewController:self.vc];
self.navC.navigationBar.translucent = NO;
self.window.rootViewController = self.navC;
[self.window makeKeyAndVisible];

现在运行您的应用程序,您将获得 64 像素的导航栏。如果您想为该视图控制器命名,那么

在 CategoryGroupViewController 的 viewDidLoad 中

self.title = @"Pick Group";

如果您想隐藏此导航栏,则只需使用特定控制器中的代码即可。但是一旦你隐藏,导航栏就会隐藏在整个应用程序中。所以你必须手动管理它。

self.navigationController.navigationBarHidden = YES;

也许这会对你有所帮助。

【讨论】:

【参考方案2】:

从 iOS 7 起,Apple 已限制使用状态栏和导航栏。我的意思是它现在是透明的。

仍有办法实现我们的目标。

方式 1: 我们可以使用 64 像素的导航栏图像(@2x 分辨率下为 128)。 它也会自动为我们的导航栏和状态栏着色。

方式 2:我们可以选择其他解决方案

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;

您需要在 -(void)viewDidLoad 方法中添加上述内容。

谢谢

【讨论】:

【参考方案3】:

假设您明确打算使用自己的导航栏而不是 UINavigationController 提供的导航栏,则需要考虑添加顶部布局指南。现在你的栏被限制在视图的顶部,相反它需要考虑状态栏的高度。您还希望能够响应状态栏的扩展(例如在通话时)。这些约束可以解决问题

id topGuide = self.topLayoutGuide;
UINavigationBar *navBar = self.navigationBar

//navBar.top == self.view.top
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[navBar]"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:NSDictionaryOfVariableBindings (navBar)]];

//pin navBar to horizontal edges
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[navBar]|"
                                                                      options:0
                                                                      metrics:nil
                                                                        views:NSDictionaryOfVariableBindings (navBar)]];

//navBar.bottom = statusBar.bottom + 44
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:navBar
                                                          attribute:NSLayoutAttributeBottom
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:topGuide
                                                          attribute:NSLayoutAttributeBottom
                                                         multiplier:1.f
                                                           constant:44]];

【讨论】:

【参考方案4】:

我也遇到了同样的问题。但是通过增加delta y positionview 解决了我的问题。

查看上面的屏幕截图。您可以像这样添加delta y 位置。这对我有用。希望它对你有用。试试这个。

【讨论】:

以上是关于iOS7:UINavigationBar 与状态栏合并的主要内容,如果未能解决你的问题,请参考以下文章

ios 7子视图UINavigationBar与状态栏重叠..任何简单的解决方案..?

IOS7 中的 UINavigationBar/状态栏问题

覆盖 UINavigationBar 时 iOS 7 状态栏变黑

在ios 7中将UI状态栏的背景颜色设置为黑色

如何在 UINavigationBar [iOS 7] 中编辑左、右 UIBarButtonItem 的空白

UIStatusBar样式与UINavigationBar一致