IOS7中的UINavigationBar/状态栏问题 最终编辑
(如果需要的话,请查看其他编辑,而不是有一个过长的问题,需要编辑才能进行最终编辑以进行澄清) 控制器设置 我有一个应用程序,其设置如下: InitialViewController(的子类) 主导航控制器(UINavigationController的子类) 主主主视图控制器(UIViewController的子类IOS7中的UINavigationBar/状态栏问题 最终编辑,ios7,uinavigationcontroller,uinavigationbar,uistatusbar,Ios7,Uinavigationcontroller,Uinavigationbar,Uistatusbar,(如果需要的话,请查看其他编辑,而不是有一个过长的问题,需要编辑才能进行最终编辑以进行澄清) 控制器设置 我有一个应用程序,其设置如下: InitialViewController(的子类) 主导航控制器(UINavigationController的子类) 主主主视图控制器(UIViewController的子类 在初始视图控制器的viewdiload中,我加载主导航控制器,主视图控制器作为其根 self.topViewController = [self.storyboard instan
在初始视图控制器的
viewdiload
中,我加载主导航控制器,主视图控制器作为其根
self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavVC"];
问题 在第一次加载应用程序时,状态栏和导航栏是分开的。 这是理想的效果 但是,我随后加载一个模态视图控制器并使用标准方法将其关闭:
[self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self];
然后以以下方式结束:
[self dismissViewControllerAnimated:YES completion:nil];
这进而导致主导航控制器(握住主视图控制器)错误地显示状态栏并重叠:
测试
查看基于控制器的状态栏外观
edgesForExtendedLayout
设置为相关的none,但没有更改Main Nav VC - Nav Bar Frame - {{0, 0}, {320, 44}}
Initial VC - View Frame - {{0, 0}, {320, 480}}
Home VC - View Frame - {{0, 0}, {320, 480}} -- viewDidLoad Home VC
Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC
--- After Modal is opened/closed ----
Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC
Main Nav VC - View Frame - {{0, 0}, {320, 480}} -- viewWillAppear Main Nav
Main Nav VC - Nav Bar Frame - {{0, 20}, {320, 44}} -- viewWillAppear Main Nav
Home VC - View Frame - {{0, 44}, {320, 436}} -- viewDidAppear Home VC
我已经详细地回答了这个问题。简单的回答是:没有办法从iOS 6和更早版本获得您习惯的自动状态栏布局行为。您必须围绕它进行设计,或者找到一种模拟旧样式的方法(我将介绍这两种方法)
我强烈建议您不要手动调整导航栏框架。让UINavigationController自己处理。您的问题很可能是导航控制器的视图框架不等于UI屏幕的边界。您是否尝试将以下代码添加到
viewDidLoad
方法中:
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
苹果公司在迁移到iOS 7时会很快解释这一点。您是否尝试过苹果公司关于“防止状态栏覆盖您的视图”的建议:
您是否看过“UIBarPositioningDelegate”:在iOS 7.0
UIViewController
默认情况下是这样工作的。如果您在UINavigationController
内部使用UIViewController,并且navigationBar
可见,则视图将全屏显示
如果导航栏可见,请执行以下操作。
==>
如果导航栏隐藏,请执行以下操作。
==>
通过移动20个点来调整所有ui视图
元素
如果您使用Interface builder,您可以使用iOS6/7增量:首先,“以iOS 6.0的形式查看”,然后将增量设置为“20”,以实现iOS 7中的+20偏移量。我遇到了一个类似的问题,即“汉堡”菜单按钮滑动主视图控制器,并且旁边有一个菜单视图控制器。我发现菜单视图控制器的导航栏不知道状态栏是否显示。我通过在状态栏显示和隐藏时发布通知来修复它,然后执行以下操作
[self.navigationController setNavigationBarHidden:YES/NO animated:NO];
在菜单的视图控制器中。我使用本文的答案解决了这样一个问题:
使用自动布局时,应忽略设置新框架。您应该为iOS 7的TopBar添加一个等于20的顶部空间限制。我参加聚会有点晚了,但因为我遇到了同样的问题,这是搜索中出现的第一个结果,我想我的答案可以帮助其他人:) 我通过实施
- (BOOL)shouldAutorotate
{
return NO;
}
在显示模式的视图控制器中。尝试一下,如果禁用,所有导航栏都应该是半透明的
[self.navigationController.navigationBar setTranslucent:NO];
如果使用故事板设计视图,则可以使用XCode解决此问题。选择NavigationBar小部件并取消选中“半透明”
解决这个问题的方法其实很简单。它涉及到操纵UINavigationBar的
center.y
值,UIKit本机使用该值将UINavigationBar调整为状态栏的高度。为了简单起见,我将UINavigationBar子类化,并执行了以下操作:
@implementation MyNavigationBar
- (void) setCenter:(CGPoint)center {
// Anything less than or equal to 22 is something we don't want (below SB height)
if(center.y > 22) [super setCenter:center];
}
@end
是的,我也有同样的问题。遵循所有步骤,但没有改变 确保为整个屏幕正确设置AutoLayout,而不仅仅是中指定的俯视图/工具栏,从而使其正常工作 “阻止状态栏覆盖您的视图”:
至少对于主Viewcontroller.view下面的所有视图。我很惊讶,还没有人找到正确的答案。UIBarPositiongDelegate工作起来很有魅力!只需将视图控制器设置为UIBarPositiongDelegate,并将其指定为该栏的代理即可。将该条放置在距离视图顶部20像素的位置。然后将此方法添加到视图控制器(仅在iOS7+中可用):
-(UIBAR位置)位置FORBAR:(id)bar
{
返回UIBarPositionTopAttached;
}
有一种内置的方法可以做到这一点。
与Joel Cave的回答相同,但详述了:
使导航栏的Y原点为20点
然后在.h文件中:
@interface XYZViewController : UIViewController <UIBarPositioningDelegate>
@接口XYZViewController:UIViewController
在.m文件中:
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationBar.delegate = self;
}
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar {
return UIBarPositionTopAttached;
}
-(void)viewDidLoad{
[超级视图下载];
self.navigationBar.delegate=self;
}
-(UIBarPosition)位置FORBAR:(id)bar{
返回UIBarPositionTopAttached;
}
我知道您的主VC是ViewController。但是,如果有人正在使用UITableviewController,并且有相同的问题,则此代码可以解决此问题:
self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);
对我来说,解决方案是将导航栏移动到20点“在顶部栏下延伸”只会影响视图与导航栏的关系。您是否尝试过将导航栏的框架向下移动状态栏的高度?但应在何处执行此操作?你能提供一个答案吗?同样的问题在这里…寻找解决方案。你找到任何解决方案了吗?我也有同样的问题,当我
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationBar.delegate = self;
}
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar {
return UIBarPositionTopAttached;
}
self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);