IOS7中的UINavigationBar/状态栏问题 最终编辑

IOS7中的UINavigationBar/状态栏问题 最终编辑,ios7,uinavigationcontroller,uinavigationbar,uistatusbar,Ios7,Uinavigationcontroller,Uinavigationbar,Uistatusbar,(如果需要的话,请查看其他编辑,而不是有一个过长的问题,需要编辑才能进行最终编辑以进行澄清) 控制器设置 我有一个应用程序,其设置如下: InitialViewController(的子类) 主导航控制器(UINavigationController的子类) 主主主视图控制器(UIViewController的子类 在初始视图控制器的viewdiload中,我加载主导航控制器,主视图控制器作为其根 self.topViewController = [self.storyboard instan

(如果需要的话,请查看其他编辑,而不是有一个过长的问题,需要编辑才能进行最终编辑以进行澄清)

控制器设置 我有一个应用程序,其设置如下:

InitialViewController(的子类)

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

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


在初始视图控制器的
viewdiload
中,我加载主导航控制器,主视图控制器作为其根

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

问题 在第一次加载应用程序时,状态栏和导航栏是分开的。

这是理想的效果

但是,我随后加载一个模态视图控制器并使用标准方法将其关闭:

[self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self];
然后以以下方式结束:

[self dismissViewControllerAnimated:YES completion:nil];
这进而导致主导航控制器(握住主视图控制器)错误地显示状态栏并重叠:

测试
  • plist设置设置为是-
    查看基于控制器的状态栏外观
  • 我已尝试将
    edgesForExtendedLayout
    设置为相关的none,但没有更改
  • 登录中 我已尝试注销一些帧以查看问题发生的位置:

    首次加载时:

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

    我已经详细地回答了这个问题。简单的回答是:没有办法从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);