IOS7中的UINavigationBar /状态栏问题

时间:2013-09-22 20:36:13

标签: ios7 uinavigationcontroller uinavigationbar uistatusbar

最终编辑

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

控制器设置

我的应用程序设置如下:

InitialViewController(ECSlidingViewController的子类)

主导航控制器(UINavigationController的子类)

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


在initialViewController的viewDidLoad中,我将主导航控制器作为其根目录加载主导航控制器。

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

问题

在应用程序的第一次加载时,状态栏和导航栏是分开的。 enter image description here

这是期望的效果。

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

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

然后关闭:

[self dismissViewControllerAnimated:YES completion:nil];

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

enter image description here

测试

  1. plist设置设为YES - View controller-based status bar appearance
  2. 我尝试将edgesForExtendedLayout设置为相关的无,但没有更改。
  3. 登录

    我试图注销一些框架以查看问题发生的位置:

    首次加载:

    主导航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
    

14 个答案:

答案 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)

对我而言,解决方案是将导航栏移至20点enter image description here

答案 12 :(得分:-1)

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

我通过实施

解决了这个问题
- (BOOL)shouldAutorotate
{
    return NO;
}

在显示模态的视图控制器中。

答案 13 :(得分:-1)

尝试一下,所有的navigationBars应该是半透明的,禁用。

[self.navigationController.navigationBar setTranslucent:NO];

如果您使用故事板设计视图,则可以使用XCode解决问题。选择NavigationBar小部件并取消选中“Translucent”。

enter image description here