【问题标题】:Hide UINavigationBar without losing Status Bar background隐藏 UINavigationBar 而不会丢失状态栏背景
【发布时间】:2017-01-02 11:53:39
【问题描述】:

我正在开发一个应用,我们在其中使用白色状态栏色调和深色背景作为导航栏。在一个场景中,我们希望隐藏导航栏,但它也带走了状态栏的背景颜色。有没有一种简单的解决方案可以同时隐藏导航栏来保持深色背景?

我隐藏导航栏的代码是:

[self.navigationController setNavigationBarHidden:YES];

或在 Swift 中:

self.navigationController?.navigationBarHidden = true

【问题讨论】:

  • 最后一句你的意思是保持白色背景吧?
  • @hasan83 不,它必须是深色的,因为我们使用的是浅色样式。
  • 知道了。您能否提供用于设置导航栏样式的代码。 (用于设置颜色的代码)
  • 你有半透明YES还是NO?
  • 它不是半透明的,但我可以设置它。那不会保留框架吗?我们需要表格视图位于状态栏的正下方。

标签: ios objective-c swift uinavigationcontroller uinavigationbar


【解决方案1】:

假设您正在为 iOS7+ 开发:状态栏本身没有任何背景颜色。事实上,当导航栏可见时,您看到深色背景的原因是它在状态栏下方向上延伸。因此,如果您想保留状态栏背景,您可以简单地将具有适当背景颜色的视图添加到当前场景(viewController、window 等)。给它一个UIApplication.sharedApplication.statusBarFrame的框架。

-- 更新 1 --

示例代码 (Swift 3) 为您提供纯黑色状态栏背景:

class ViewController: UIViewController {
  private let statusBarUnderlay = UIView()

  override func viewDidLoad() {
    super.viewDidLoad()

    statusBarUnderlay.backgroundColor = UIColor.black
    view.addSubview(statusBarUnderlay)
  }

  override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    statusBarUnderlay.frame = UIApplication.shared.statusBarFrame
  }
}


-- 更新 2 --

当我们在做的时候。上面的代码不是你应该如何布局你的视图。相反,继承 UIView 并在那里进行布局。然后覆盖 UIViewController 子类的 loadView 并返回自定义视图的实例。


class View: UIView {
  private let statusBarUnderlay = UIView()

  override init(frame: CGRect) {
    super.init(frame: frame)

    statusBarUnderlay.backgroundColor = UIColor.black
    addSubview(statusBarUnderlay)
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("Storyboards are incompatible with truth and beauty.")
  }

  override func layoutSubviews() {
    super.layoutSubviews()

    statusBarUnderlay.frame = UIApplication.shared.statusBarFrame
  }
}

【讨论】:

  • 所以这种工作。它创建了视图,但将其直接定位在状态栏下方。
  • 您可以记录视图框架吗?纵向应该是 {0, 0, screenWidth, 20}
  • 如果我使用 lldb 来“po view.frame”,我会得到:(origin = (x = 0, y = 0), size = (width = 0, height = 0))跨度>
  • 嗯。这意味着视图根本不可见。通过 lldb 使用 po,这实际上取决于您何时中断和记录。你确定你的视图层次结构在记录框架之前调用了 layoutSubviews 吗?另外,你可以 po UIApplication.sharedApplication.statusBarFrame,这不应该返回 CGRectZero ......我已经更新了我的答案
  • 好吧,我想通了。出于某种原因,它正在考虑将 (0, 0) 作为状态栏正下方的角。我将 y 设置为 -20,它看起来不错。我们在一起就是一个地狱般的开发者! =D 感谢您为我指明正确的方向!
【解决方案2】:

这里是LTNavigationBar的实现

我认为这对你有帮助。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat offsetY = scrollView.contentOffset.y;
    if (offsetY > 0) {
        if (offsetY >= 44) {
            [self setNavigationBarTransformProgress:1];
        } else {
            [self setNavigationBarTransformProgress:(offsetY / 44)];
        }
    } else {
        [self setNavigationBarTransformProgress:0];
        self.navigationController.navigationBar.backIndicatorImage = [UIImage new];
    }
}

- (void)setNavigationBarTransformProgress:(CGFloat)progress
{
    [self.navigationController.navigationBar.transform = CGAffineTransformMakeTranslation:(0, -44 * progress)];
}

它使导航栏隐藏和状态栏在滚动视图时与导航栏的背景颜色相同。如果不需要滚动,可以直接调用[self setNavigationBarTransformProgress:1]

【讨论】:

    【解决方案3】:

    我需要做的就是添加一个辅助视图并将其设置在状态栏下方,如下所示:

    -(void)viewForStatusBar {
        UIView *view = [UIView new];
        [self.view addSubview:view];
        view.backgroundColor = [UIColor blackColor];        
        view.frame = CGRectMake(0, -20, [UIScreen mainScreen].bounds.size.width, 20);
    }
    

    或者在 Swift 中:

    func viewForStatusBar() {
            let view = UIView()
            self.view.addSubview(view)
            view.backgroundColor = .blackColor()
            view.frame = CGRectMake(0, -20, UIScreen.mainScreen().bounds.size.width, 20)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多