【问题标题】:UINavigationController has extra status bar gap at topUINavigationController 在顶部有额外的状态栏间隙
【发布时间】:2012-02-11 00:30:52
【问题描述】:

当我设置它时,这看起来很简单,但我无法解释为什么状态栏和导航栏之间存在这种差距。此外,包含的视图看起来可能已正确对齐,并且它只是向下移动的导航栏。间隙看起来像状态栏的大小,所以我认为这与它有关,但我不知道是什么。

下面是设置导航控制器的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    advancedVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:advancedVC];
    nav.navigationBar.tintColor = [UIColor defaultNavBarTint];
    nav.navigationBar.topItem.title = NSLocalizedString(@"SearchTitle", nil);
    UIBarButtonItem *searchButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"SearchButton", nil) style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];          
    nav.navigationBar.topItem.rightBarButtonItem = searchButton;

    self.view = nav.view;
}

rootViewController 使用来自 xib 文件的视图,我在其中模拟了状态栏、导航栏和选项卡栏。

【问题讨论】:

  • 请注意,这是 iOS 5 和更早版本之间存在差异的地方。如果您为导航控制器使用“罐装”布局,它相当便携,但如果您完全自定义了它,那么两个版本之间的事情就会发生很大变化。 (我从来没有完全确定造成差异的原因,但您所展示的内容对于在 iOS 5 上运行的 iOS 4 代码来说是典型的。)
  • 看到这个问题的第一个答案stackoverflow.com/questions/5850705/…

标签: ios cocoa-touch uinavigationcontroller uinavigationbar


【解决方案1】:

问题确实是导航控制器总是希望为状态栏留出空间,也就是 20 像素的间隙。在找到这个可行的解决方案之前,我搜索了一段时间:

//nav is assumed to be a subclass or instance of UINavigationController
nav.view.frame = CGRectOffset(nav.view.frame, 0.0, -20.0);
//you can then add the navigation's view as a subview to something else

我最初找到了一个答案,它对导航栏的视图做了这个偏移,但它没有用。当您对导航控制器的实际视图执行此操作时,它会起作用。

我使用这种技术将导航控制器从另一个 nib 添加到我的主 nib 的空视图中,因此我可以将它定位在主屏幕中的任何位置作为子视图。通过在我的主笔尖上使用一个空视图作为占位符和定位框架,我创建了一个单独的笔尖和类来管理导航,它管理用于处理其屏幕的其他笔尖。通过这种方式,我可以解决经典的“如何在导航控制器上方添加横幅、图像或自定义视图”,同时将导航控制器作为子视图...在 iOS 5 中具体而言。

还值得一提的是,我使用应用程序委托来存储和访问所有其他控制器,因此它们由我可以从任何类访问的持久实例保留。在所有控制器的应用程序委托中创建和综合一些属性,并在 viewDidLoad 创建实例。这样我以后可以在任何地方通过添加引用我的应用程序中使用的所有控制器:

//this shows how to store your navigation controllers in the app delegate
//assumes you've added 2 properties (UINavigationController*)"navController" and (UIViewController*)"rootController" in your app delegate
//...don't forget to add #import "AppDelegate.h" to the top of the file

AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[app.navController pushViewController: app.rootController animated:YES];
//now apply the offset trick to remove the status gap
app.navController.view.frame = CGRectOffset(app.navController.view.frame, 0.0, -20.0);

【讨论】:

    【解决方案2】:

    我之前也遇到过同样的问题。我用来添加 UINavigationBar 到 UIViewController 的代码:

    UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:self];
    [self.view  addSubview:nc.view];
    

    解决方案:
    使用 UIViewController 的属性检查器选中“想要全屏”框。

    【讨论】:

      【解决方案3】:

      您可以尝试从 UIViewController 的 Attributes 部分设置属性 Under Top Bars unchecked。 p>

      【讨论】:

        【解决方案4】:

        我们现在都知道,20 像素的移位是为顶部的状态栏提供空间。 但事实上,视图控制器坐标系保持不变,只有导航栏框架向下移动了 20 个像素。这使得导航栏实际上与视图的前 20 个像素重叠。

        记录导航栏框架的原点,它将显示 (0.0, 20.0)

        因此解决方案是简单地将导航栏的原点重新定位到 ViewWillAppear 中的 (0.0, 0.0)。

        self.navigationController.navigationBar.frame = CGRectMake(0.0, 0.0, self.navigationController.navigationBar.frame.size.width, self.navigationController.navigationBar.frame.size.height);
        

        【讨论】:

          【解决方案5】:

          由于您将advancedVC 添加为self.view子视图,因此它被添加到self.view 的框架内,我猜这已经补偿了状态栏。

          您可以通过添加此行轻松解决此问题:

          nav.view.frame = self.view.frame;
          

          就在这条线的上方:

          self.view = nav.view;
          

          -

          其他想法

          我不知道您的整个设置,但可能根本不需要self.view。只需将您的 advancedVC 实例设置为您的 App Delegate 中包含的 UIWindow 实例的 rootViewController

          【讨论】:

            【解决方案6】:

            问题已通过修复导航控制器的插入方式得到解决。导航控制器应该直接放在导航控制器上,而不是将其插入到已放在标签栏控制器上的视图中。

            advancedSearchFormVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil];
            UINavigationController *searchNavController = [[UINavigationController alloc] initWithRootViewController:advancedSearchFormVC];
            

            这只是tabbar控制器上的一个控制器,同时替代了advancedSearchFormVC。然后这个导航控制器被添加到被放到标签栏控制器上的控制器数组中。

            很抱歉有任何问题,但这是我可以直接查看但看不到的问题之一。我应该早点看到这个,因为我在标签栏控制器上已经有另一个导航控制器,并且它的设置方式相同。

            感谢您的帮助。

            【讨论】:

            • 吉姆——我没有完全按照你的解决方案。你能发布代码来显示实际的修复吗?
            【解决方案7】:

            问题是 UINavigationController.view 应该添加到顶视图。 只要找到最上面的那个,它就会很好用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-07-08
              • 1970-01-01
              • 1970-01-01
              • 2016-09-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多