【问题标题】:setStatusBarHidden:NO after XIB load covers UINavigationBarsetStatusBarHidden:NO 后 XIB 加载覆盖 UINavigationBar
【发布时间】:2011-07-10 20:24:32
【问题描述】:

setStatusBarHidden:NO 设置为 视图加载之前,UINavigationBar 和其他元素会显示在 StatusBar 的正下方。但是,当 setStatusBarHidden:NO 设置 视图加载后,UINavigationBar 会被部分覆盖。

在加载上述视图后必须显示状态栏,但是如何才能在不遇到上述问题的情况下这样做呢?

【问题讨论】:

  • 我也很想知道这个问题的答案。

标签: ios uinavigationbar xib uistatusbar


【解决方案1】:

我的猜测是在显示状态栏之前正在加载导航栏,因此导航栏的位置是 (0,0),然后与 (0,0) 处的状态栏重叠。在调用setStatusBarHidden:NO 后,您可以在viewDidLoad 中移动导航栏的框架(或设置动画块)。 尝试做navigationBar.frame = CGRectMake(0,20,320,44); 状态栏为 320x20,因此只需将导航栏向下移动 20 即可。

【讨论】:

    【解决方案2】:

    我在我的代码中发现了一个 hack,但不记得或找不到它的来源。诀窍是通过隐藏和重新显示导航栏来刷新它:

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

    在我的代码中,函数如下所示:

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
    
        [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
    
        [self.navigationController setNavigationBarHidden:YES animated:NO];
        [self.navigationController setNavigationBarHidden:NO animated:NO];
    }
    

    但是,警告,这是一个 hack,目前我正在努力解决一些似乎源自此代码的错误(导航项不匹配导航内容)。但由于它在某些地方确实对我有用,所以我想我会提到它。

    编辑: 我想我在这里找到了最初的帖子: How do I get the navigation bar in a UINavigationController to update its position when the status bar is hidden?

    GL, 奥德

    【讨论】:

      【解决方案3】:

      这就是我现在在 iOS 5 中的根控制器中在我告诉状态栏动画后所做的事情。丑陋,但它似乎可以工作。

      CGRect rect;
      
      if ( self.interfaceOrientation == UIInterfaceOrientationPortrait )
          rect = CGRectMake(0, 20, 320, 460);
      else if ( self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown )
          rect = CGRectMake(0, 0, 320, 460);
      else if ( self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft )
          rect = CGRectMake(20, 0, 300, 480);
      else
          rect = CGRectMake(0, 0, 300, 480);
      
      [UIView animateWithDuration:0.35 animations:^{ self.view.frame = rect; }];
      

      【讨论】:

        【解决方案4】:

        (我意识到这是一个老问题,但我只花了半个小时试图自己找到答案,但没有成功,所以我想我会把它贴在这里给其他陷入困境的人......特别是如果你正在尝试显示状态栏,您的视图最终与它重叠)

        如果你想隐藏状态栏,我发现这很有效......

        [[UIApplication sharedApplication] setStatusBarHidden:YES];
        [self.view setFrame: [[UIScreen mainScreen] bounds]];
        

        但不是当你想显示状态栏时...... 在那种情况下,我使用这个可行的解决方案,但让我担心,因为它将状态栏高度硬编码为 20 ...... 它也让我担心我必须根据方向不同地调整视图。但如果我不这样做,它总是会在错误的边缘出现 20 分的差距。 就我而言,我想为某些视图关闭状态栏,然后在返回时重新打开。如果在酒吧关闭时旋转设备,我会遇到特别的问题。所以 switch 语句虽然丑陋(有人可能会发布更干净的解决方案),但可以工作。

        [[UIApplication sharedApplication] setStatusBarHidden:NO];
        
        CGRect frame = [[UIScreen mainScreen] bounds];
        
        switch (self.interfaceOrientation) 
        {
            case UIInterfaceOrientationPortrait:
                frame.origin.y = 20;
                frame.size.height -= 20;
                break;
        
            case UIInterfaceOrientationPortraitUpsideDown:
                frame.origin.y = 0;
                frame.size.height -= 20;
                break;
        
            case UIInterfaceOrientationLandscapeLeft:
                frame.origin.x = 20;
                frame.size.width -= 20;
                break;
        
            case UIInterfaceOrientationLandscapeRight:
                frame.origin.x = 0;
                frame.size.width -= 20;
                break;
        
        } 
        
        [self.view setFrame:frame];
        

        【讨论】:

          【解决方案5】:

          如果您遇到此问题是因为在加载 Default.png 时没有显示状态栏,然后想在查看您的第一个 View Controller 时立即显示状态栏,请确保您将 [[UIApplication sharedApplication] setStatusBarHidden:NO]; 放在前面[self.window makeKeyAndVisible]; 在您的 AppDelegate.m 中。它发生得如此之快,您永远不会在初始屏幕上看到状态栏。

          [[UIApplication sharedApplication] setStatusBarHidden:NO];
          [self.window makeKeyAndVisible];
          

          【讨论】:

          • 这对我有用,只要确保在 AppDelegate 中的 [self.window makeKeyAndVisiable] 之前插入 set statusBarHidden: withAnimation: 方法即可。
          【解决方案6】:

          在 iOS 7 中你可以使用:

          setNeedsStatusBarAppearanceUpdate
          

          例如:

          [self.mainViewController.navigationController setNeedsStatusBarAppearanceUpdate];
          

          苹果文档:

          如果视图控制器的状态栏属性调用此方法,例如 作为隐藏/未隐藏的状态或风格,改变。如果你调用这个方法 在一个动画块中,这些变化会随着 动画块的其余部分。

          仅适用于 iOS 7。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多