47

最终编辑

(不要有一个过长的问题,需要进行最终编辑以进行澄清,如果需要,请参阅其他编辑)。

控制器设置

我有一个设置如下的应用程序:

InitialViewController(ECSlidingViewController 的子

主导航控制器(的子类UINavigationController

主主视图控制器(的子类UIViewController


viewDidLoadinitialViewController 中,我将主导航控制器加载到主视图控制器作为其根。

self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavVC"];

问题

在应用程序的第一次加载时,状态栏和导航栏是分开的。 在此处输入图像描述

这是想要的效果。

但是,然后我使用标准方法加载模式视图控制器并关闭它:

[self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self];

然后关闭:

[self dismissViewControllerAnimated:YES completion:nil];

这反过来会导致主导航控制器(持有主视图控制器)错误地显示状态栏并重叠:

在此处输入图像描述

测试

  1. plist 设置设置为 YES -View controller-based status bar appearance
  2. 我已经尝试将 设置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
4

14 回答 14

39

您是否尝试过 Apple 关于“防止状态栏覆盖您的视图”的建议:https ://developer.apple.com/library/content/qa/qa1797/_index.html

你有没有看过“UIBarPositioningDelegate”:https ://developer.apple.com/documentation/uikit/uibarpositioningdelegate

于 2013-09-26T04:58:04.227 回答
26

在 iOS 7.0UIViewController中默认以这种方式工作。UINavigationController如果您在内部使用 UIViewController并且navigationBar可见,则视图将全屏显示。

如果导航栏可见,请执行以下操作。==>

self.edgesForExtendedLayout = UIRectEdgeNone

如果导航栏被隐藏,请执行以下操作。==>

UIView通过移动 20 点调整所有元素

如果你使用Interface builder,你可以使用iOS6/7 deltas:首先“view as iOS 6.0”,然后设置一个delta为“20”来实现iOS 7中的+20偏移

于 2013-09-26T17:51:01.383 回答
18

我很惊讶还没有人找到正确的答案。UIBarPositioningDelegate 就像一个魅力!只需将您的视图控制器设置为 UIBarPositioningDelegate 并将其分配为栏的代表。将条形图放置在距离视图顶部 20 像素的位置。然后将此方法添加到您的视图控制器(仅在 iOS7+ 中可用):

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar 
{ 
   return UIBarPositionTopAttached; 
}
于 2014-05-23T14:18:39.977 回答
4

我在“汉堡包”菜单按钮上遇到了类似的问题,该按钮将主视图控制器滑过并在侧面有一个菜单视图控制器。我发现菜单视图控制器的导航栏不知道状态栏是否显示。我通过在显示状态栏并隐藏然后执行时发布通知来修复它

[self.navigationController setNavigationBarHidden:YES/NO animated:NO];

在菜单的视图控制器中。

于 2013-10-01T03:43:43.907 回答
3

我使用这篇文章的答案解决了这样一个问题:iOS 7 | 导航栏/工具栏按钮非常靠近状态栏

使用自动布局你应该忽略设置一个新的框架。您应该为 iOS 7 的 TopBar 添加一个等于 20 的顶部空间约束。

于 2013-10-01T10:34:23.817 回答
3

您是否尝试将以下代码添加到您的viewDidLoad方法中:

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

Apple迁移到 iOS 7文档中快速解释了这一点。

于 2013-09-25T13:17:36.857 回答
1

我知道您将 ViewController 作为主要 VC。但是如果有人在使用 UITableviewController 并且遇到同样的问题,这段代码可以解决这个问题:

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);
于 2014-12-19T12:34:42.210 回答
1

在this answer to a similar question中详细回答了这个问题。简短的回答是:无法从 iOS 6 及更早版本中获得您习惯的自动状态栏布局行为。您必须围绕它进行设计,或者找到一种模拟旧样式的方法(我涵盖了这两种方法)。

我强烈建议您不要对导航栏框架进行手动调整。让 UINavigationController 自己处理。很可能,您的问题是导航控制器的视图框架不等于 UIScreen 的边界。

于 2013-09-23T18:08:48.457 回答
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; 
}
于 2014-07-26T06:19:26.493 回答
0

是的有同样的问题。遵循所有步骤,但没有变化。

通过确保为整个屏幕正确设置 AutoLayout 而不仅仅是顶部视图/工具栏来使其正常工作

“防止状态栏覆盖您的视图”:https ://developer.apple.com/library/ios/qa/qa1797/_index.html

至少对于主 Viewcontroller.view 下方的所有视图。

于 2014-04-23T15:00:14.100 回答
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
于 2014-04-12T23:48:49.500 回答
0

对我来说,解决方案是将导航栏移至 20 点在此处输入图像描述

于 2015-10-31T16:02:39.710 回答
-1

我参加聚会有点太晚了,但是由于我遇到了同样的问题,这是搜索中出现的第一个结果,我想我的回答可以帮助其他人:)

我通过实施解决了这个问题

- (BOOL)shouldAutorotate
{
    return NO;
}

在呈现模式的视图控制器中。

于 2014-02-26T02:59:24.607 回答
-1

试试看,所有的导航栏都应该是半透明的。

[self.navigationController.navigationBar setTranslucent:NO];

如果您使用情节提要设计视图,则可以使用 XCode 解决问题。选择 NavigationBar 小部件并取消选中“半透明”。

在此处输入图像描述

于 2014-02-26T06:08:37.447 回答