黑色半透明导航栏不透明直到第一次拖动

时间:2017-02-08 08:42:06

标签: ios uinavigationcontroller uikit

我有一个奇怪的情况,我不能为我的生活得到一个应用程序开始UINavigationBar设置为透明黑色。该应用包含UINavigationController,其中UIPageViewController为根。这些是在应用程序启动时从故事板加载的。

应用程序运行,UINavigationBar显示为不透明。一旦我开始拖动UIPageViewController,它就会触发某种重绘,UINavigationBar会根据需要变得透明。

我尝试了几种不同的方法将UINavigationBar设置为透明黑色,但没有一种方法产生与描述不同的行为:

  1. 我在Info.plist
  2. 中设置了这些键
    <key>UIStatusBarTintParameters</key>
    <dict>
         <key>UINavigationBar</key>
         <dict>
             <key>Style</key>
             <string>UIBarStyleBlack</string>
             <key>Translucent</key>
             <true/>
         </dict>
    </dict>
    
    1. 我在UINavigationBar的AppDelegate中设置didFinishLaunchingWithOptions外观:

      UINavigationBar.appearance().tintColor = UIColor.black
      UINavigationBar.appearance().isTranslucent = true
      
    2. 我已将[{1}}子类化,并在UINavigationController中设置了NavigationBar属性:

      viewDidLoad()
    3. 我在navigationBar.barStyle = .black navigationBar.isTranslucent = true navigationBar.setNeedsDisplay() (导航控制器的根视图控制器)的viewDidLoad()中设置了NavigationBar属性:

      UIPageViewController
    4. 我还尝试打开/关闭导航栏以触发刷新

      navigationController!.navigationBar.barStyle = .black
      navigationController!.navigationBar.isTranslucent = true
      navigationController!.navigationBar.setNeedsDisplay()
      
      1. 为了完成,我在 navigationController!.isNavigationBarHidden = true navigationController!.isNavigationBarHidden = false 的子视图控制器的viewDidLoad()中设置了导航栏属性。
      2. 在每一种情况下,我都会得到相同的行为:不透明条直到我触摸屏幕并开始拖动,此时它会切换到透明。

        奇怪的是,设置导航栏的其他属性(例如UIPageViewControllertitleTextAttributesleftButtonItem的工作正常,并且会立即反映更改。

2 个答案:

答案 0 :(得分:0)

我对 Swift3 提出了类似要求,并以此方式实现了这一目标:

  1. 在包含PageViewController的视图控制器中,在viewDidLoad()

    中添加以下代码
    func makeNavigationTranslucent() -> Void {
      self.navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
      self.navigationController?.navigationBar.shadowImage = nil
      self.navigationController?.navigationBar.isTranslucent = true
      self.navigationController?.view.backgroundColor = UIColor.clear
      self.navigationController?.navigationBar.backgroundColor = UIColor.init(colorLiteralRed: 0.5, green: 0.5, blue: 0.5, alpha: 0.9)
    }
    

    注意:将navigationBar.backgroundColor更改为您想要的那个。

  2. storyboard选择您的控制器并在属性检查器下,将模拟指标标题设置为导航半透明栏。请参阅下图:

  3. enter image description here

答案 1 :(得分:0)

这是一种hacky解决方案,但我设法通过隐藏默认导航栏并在其上添加新的导航栏来实现它。在页面视图中,控制器viewDidLoad()功能:

navigationController!.isNavigationBarHidden = true

let newNavBar = UINavigationBar()
newNavBar.barStyle = .black
newNavBar.isTranslucent = true

newNavBar.titleTextAttributes = [NSFontAttributeName: UIFont.mainFontThin(24),
                                 NSForegroundColorAttributeName: UIColor.white]
// etc...

navigationController!.view.addSubview(newNavBar)

newNavBar.frame = CGRect(
    x:0, y:0,
    width:navigationController!.view.bounds.width,
    height:navigationController!.navigationBar.frame.height + UIApplication.shared.statusBarFrame.height
)

newNavBar.pushItem(navigationItem, animated: false)

这显示了我们想要的半透明导航栏,但在半透明导航栏下应用状态栏为黑色仍然是一个小问题。和以前一样,拖动手指后状态栏会更新为透明。我不确定如何解决此问题,添加对setNeedsStatusBarUpdate()的调用没有帮助。所以这是部分修复。