【问题标题】:Preventing UINavigationController from adjusting origin when status bar is hidden in iOS 7在iOS 7中隐藏状态栏时防止UINavigationController调整原点
【发布时间】:2014-02-03 09:14:36
【问题描述】:

我在UITabBar 控制器中有一系列UINavigationControllers。我想隐藏状态栏。但是,当我这样做时,导航栏会自行调整以变短:

Problem Image

我怎样才能防止这种情况并得到如下图所示的东西?

desired outcome

目前我只是使用[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];隐藏状态栏

【问题讨论】:

    标签: ios iphone objective-c uinavigationcontroller statusbar


    【解决方案1】:

    使用自定义 sizeThatFits 创建自定义 UINavigationBar。

    @implementation UINavigationBar (customNavigationBar)
      - (CGSize)sizeThatFits:(CGSize)size {
        CGSize newSize = CGSizeMake(self.frame.size.width,64);
        return newSize;
      }
    @end
    

    如果有任何疑问请联系我们

    【讨论】:

    • 将高度设置为64-[UIApplication sharedApplication].statusBarFrame.size.height 似乎可行,但在更改状态栏时会导致一些卡顿
    • 将高度设置为不在状态栏中的导航栏
    • 不,我明白这一点。但是当状态栏不隐藏时,使用 64 的固定高度会导致 84px 高的导航栏。因此,我们需要减去状态栏的高度以获得一致的 64px
    • 上帝 iOS 7 会很烦人
    • 为什么要增加导航栏尺寸
    【解决方案2】:

    您可以在 Storyboard 中创建一个容器视图并设置一个固定的顶部空间(与状态栏相同)。你可以在这个视图中嵌入你的NavigationController。

    Image 1

    Image 2

    我希望这会有所帮助。

    编辑:添加图片

    【讨论】:

    • 你的意思是嵌入UITabBarController吗?
    • 这个,或者特定的 UINavigationController。这取决于您的需求。这只是一个想法,也许有更好的解决方案。
    • 这不能使用 Autolayout 解决吗?
    • 在您的图片中,导航栏的高度仍然为 44px,而不是所需的 64。您只是将 20px 的间隙从底部移到顶部
    【解决方案3】:

    在 appDelegate.m - 创建导航控制器并将其设置为根视图控制器

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {       
           UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    
    
            HomeViewController *homeViewController = (HomeViewController *)[storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];
    
            self.navigationController = [[UINavigationController alloc] initWithRootViewController:homeViewController];
    
            [self.navigationController setNavigationBarHidden:YES];
    
            self.window.rootViewController = self.navigationController;
    
            return YES;
    }
    

    然后,您可以使用 UIImageView + 标签 + 按钮等重新创建导航栏,而不是导航栏...
    然后您需要提供正确的自动调整大小掩码,以便 UIImageView 正确调整自身

    【讨论】:

      【解决方案4】:

      这是 codercat 答案的修改版本。隐藏状态栏时,导航栏的origin.y为0。本例中,我设置它的高度为64。当状态栏不隐藏时,保持默认高度44。

      @implementation UINavigationBar (customNavigationBar)
      - (CGSize)sizeThatFits:(CGSize)size {
          CGPoint originInWindow = [self.window convertPoint:CGPointZero fromView:self];
          CGFloat height = originInWindow.y > 1 ? 44 : 64;
          return CGSizeMake(self.frame.size.width, height);
      }
      @end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多