iOS hidesBarsOnSwipe 状态栏背景颜色

Posted

技术标签:

【中文标题】iOS hidesBarsOnSwipe 状态栏背景颜色【英文标题】:iOS hidesBarsOnSwipe status bar background color 【发布时间】:2015-06-01 21:19:58 【问题描述】:

当我使用hidesBarsOnSwipe 属性滑动并隐藏导航栏时,状态栏有清晰的背景。如何将状态栏的背景设置为与导航栏相同的颜色?这里有几张显示我的问题的图片,这些都包含在UITableViewController中。

分开

单独的图片,看起来像一张大的。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,并且能够解决它。我对 ios 开发人员相当陌生,我不认为这个解决方案是万无一失的。我在其他地方找不到任何好的答案,所以这就是我克服它的方法:

    我从 UITableViewController 转换为带有嵌套 UITableView 的 UIViewController。请注意,请仔细检查子表视图的委托是否设置为 UIViewController。

    我添加了一个高度为 20 像素的视图和一个要设置为状态栏“背景”的背景颜色。设置该视图的约束如下:

    在您的表格视图中,将约束设置为基本上全屏。这里有一个重要注意事项,顶部约束是“Top Layout Guide.Top”而不是“Top Layout Guide.Bottom”。默认情况下,我相信这个约束与底部有关。双击约束可以将其调整到顶部。没有这个,任何表格标题单元格都没有正确定位我

希望对您有所帮助。

【讨论】:

我还想我会提到,状态栏样式可能会在折叠时从浅色变为深色。在这种情况下,preferredStatusBarStyle 是您可以正确控制状态主题的地方。 ` override func preferredStatusBarStyle() -> UIStatusBarStyle return UIStatusBarStyle.LightContent ` 你不需要将视图的高度指定为20。只需将顶部约束添加到Superview.top = 0,将前导和尾随约束添加到safeArea,底部约束= 0与tableView 。最佳。这样,即使对于 iPhone X 和任何其他尺寸,视图也会自行拉伸到所需的高度。即使您旋转设备。 TableView 应该像往常一样受到约束:顶部、前导、尾随和底部 = 0 到 safeArea,或任何其他约束。重要的是 tableView.top 被约束到 safeArea 或 Superview.top,并且是视图层次结构中的第一个子视图。【参考方案2】:

添加到 George Huber 的答案。我通过在 viewDidLoad 方法中添加一个 20pt 高度的 UIView 作为 navigationController 的视图属性的子视图,以编程方式解决了这个问题。

- (void)viewDidLoad

  [super viewDidLoad];

  UIView *statusBarBG = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), 20)];
  statusBarBG.backgroundColor = [UIColor navBar];
  [self.navigationController.view addSubview:statusBarBG];

  // REST OF CODE

【讨论】:

【参考方案3】:

根据 skg 的回答,我根据 iOS 版本添加了状态栏的相对高度。

    self.navigationController.hidesBarsOnSwipe = true;
    
    // add a UIView as subView to navigationController
    CGFloat statusBarHeight;
    
    if (@available(iOS 13, *)) 
        NSArray *windows = UIApplication.sharedApplication.windows;
        UIWindow *keyWindow = nil;
        
        for (UIWindow *window in windows) 
            if (window.isKeyWindow) 
                keyWindow = window;
                break;
            
        
        statusBarHeight = keyWindow.windowScene.statusBarManager.statusBarFrame.size.height;
        NSLog(@"statusBarHeight: %f", statusBarHeight);
     else 
        statusBarHeight = UIApplication.sharedApplication.statusBarFrame.size.height;
    
    
    UIView *statusBarBG = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), statusBarHeight)];
    statusBarBG.backgroundColor = [UIColor systemBackgroundColor];
    [self.navigationController.view addSubview:statusBarBG];

【讨论】:

以上是关于iOS hidesBarsOnSwipe 状态栏背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 包含、iOS7 和状态栏。漏洞?

隐藏导航栏时隐藏状态栏 - SWIFT iOS8

滚动时隐藏状态栏

UINavigationController.hidesBarsOnSwipe=YES 导致 NSInternalInconsistencyException

使用 hidesBarsOnSwipe 更新 ProgressView 的约束

hidesBarsOnSwipe 不起作用