(与编辑进行最终编辑以进行澄清时,不要过长的问题,如果需要,请参阅其他修改)。
我的应用程序设置如下:
InitialViewController(ECSlidingViewController的子类)
主导航控制器(UINavigationController
的子类)
主要主视图控制器(UIViewController
的子类)
在initialViewController的viewDidLoad
中,我将主导航控制器作为其根目录加载主导航控制器。
self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavVC"];
在应用程序的第一次加载时,状态栏和导航栏是分开的。
这是期望的效果。
然而,我然后使用标准方法加载模态视图控制器并关闭它:
[self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self];
然后关闭:
[self dismissViewControllerAnimated:YES completion:nil];
这反过来导致主导航控制器(持有主视图控制器)错误地显示状态栏并重叠:
View controller-based status bar appearance
edgesForExtendedLayout
设置为相关的无,但没有更改。我试图注销一些框架以查看问题发生的位置:
首次加载:
主导航VC - 查看框架 - {{0,0},{320,480}}
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
答案 0 :(得分:39)
您是否尝试过Apple关于“防止状态栏覆盖您的观点”的建议:https://developer.apple.com/library/content/qa/qa1797/_index.html
您是否看过“UIBarPositioningDelegate”:https://developer.apple.com/documentation/uikit/uibarpositioningdelegate
答案 1 :(得分:26)
在iOS 7.0中UIViewController
默认以这种方式工作。如果您在UINavigationController
内使用UIViewController并且navigationBar
可见,则视图将全屏显示。
如果navigationBar可见,请执行以下操作。 ==>
self.edgesForExtendedLayout = UIRectEdgeNone
如果隐藏了navigationBar,请执行以下操作。 ==>
通过移动20个点来调整所有UIView
元素
如果使用“界面”构建器,则可以使用iOS6 / 7增量:首先,“以iOS 6.0查看”,然后设置增量“20”以在iOS 7中实现+20偏移
答案 2 :(得分:18)
我很惊讶没有人找到正确的答案。 UIBarPositioningDelegate就像一个魅力!只需将您的视图控制器设置为UIBarPositioningDelegate并将其指定为条形图的委托。将条形图从视图顶部放置20个像素。然后将此方法添加到视图控制器(仅在iOS7 +中可用):
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
return UIBarPositionTopAttached;
}
答案 3 :(得分:4)
我和汉堡包有类似的问题&#34;菜单按钮,滑动主视图控制器并在侧面有一个菜单视图控制器。我发现菜单视图控制器的导航栏不知道状态栏是否显示。我通过在状态栏显示时发布通知并隐藏然后执行
来修复它[self.navigationController setNavigationBarHidden:YES/NO animated:NO];
在菜单的视图控制器中。
答案 4 :(得分:3)
您是否尝试将以下代码添加到viewDidLoad
方法中:
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
快速解释 Apple 迁移到iOS 7 doumentation.
答案 5 :(得分:3)
我使用这篇文章的答案解决了这个问题:iOS 7 | Navigation bar / Toolbar buttons very close to status bar
使用Autolayout,您应该忽略设置新的Frame。你应该为TopBar for iOS 7添加一个等于20的Top Space Constraint。
答案 6 :(得分:1)
我已经详细解答了这个问题in this answer to a similar question。简短的回答是这样的:无法获得您在iOS 6及更早版本中习惯的自动状态栏布局行为。你必须围绕它进行设计,或者找到一种模拟旧样式的方法(我介绍了这两种方法)。
我强烈建议您不手动调整导航栏框架。让UINavigationController自己处理。最有可能的是,您的问题是导航控制器的视图框架不等于UIScreen的界限。
答案 7 :(得分:1)
我知道您将ViewController作为主VC。但如果有人使用UITableviewController并遇到同样的问题,这段代码就解决了这个问题:
self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);
答案 8 :(得分:0)
解决方案实际上非常简单。它涉及操纵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
答案 9 :(得分:0)
是的,有同样的问题。按照所有步骤但没有改变。
通过确保为整个屏幕正确设置AutoLayout,而不仅仅是
中指定的顶视图/工具栏,确保其正常工作&#34;防止状态栏覆盖您的观点&#34; :https://developer.apple.com/library/ios/qa/qa1797/_index.html
至少对于主Viewcontroller.view下方的所有视图。
答案 10 :(得分:0)
有一种内置的方法可以做到这一点。 与Joel Cave的回答相同,但详细说明:
使导航栏的Y值为20点。
然后在.h文件中:
@interface XYZViewController : UIViewController <UIBarPositioningDelegate>
在.m文件中:
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationBar.delegate = self;
}
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar {
return UIBarPositionTopAttached;
}
答案 11 :(得分:0)
答案 12 :(得分:-1)
我对聚会来说太晚了,但是由于我遇到了同样的问题,这是搜索中出现的第一个结果,我想我的回答可以帮助其他人:)
我通过实施
解决了这个问题- (BOOL)shouldAutorotate
{
return NO;
}
在显示模态的视图控制器中。
答案 13 :(得分:-1)
尝试一下,所有的navigationBars应该是半透明的,禁用。
[self.navigationController.navigationBar setTranslucent:NO];
如果您使用故事板设计视图,则可以使用XCode解决问题。选择NavigationBar小部件并取消选中“Translucent”。