iOS7:UINavigationBar 与状态栏合并
Posted
技术标签:
【中文标题】iOS7:UINavigationBar 与状态栏合并【英文标题】:iOS7: UINavigationBar merges with status bar 【发布时间】:2014-11-21 04:06:11 【问题描述】:我是ios
的新手,我正在关注以下情况
UIViewController
,其中有UITableView
和UINavigationBar
@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 position
的view
解决了我的问题。
查看上面的屏幕截图。您可以像这样添加delta y
位置。这对我有用。希望它对你有用。试试这个。
【讨论】:
以上是关于iOS7:UINavigationBar 与状态栏合并的主要内容,如果未能解决你的问题,请参考以下文章
ios 7子视图UINavigationBar与状态栏重叠..任何简单的解决方案..?
覆盖 UINavigationBar 时 iOS 7 状态栏变黑