黑色半透明导航栏在第一次拖动前不透明
Posted
技术标签:
【中文标题】黑色半透明导航栏在第一次拖动前不透明【英文标题】:Black Translucent Navigation Bar Opaque Until First Drag 【发布时间】:2017-02-08 08:42:05 【问题描述】:我有一个奇怪的情况,我一生都无法获得一个应用程序以将UINavigationBar
设置为透明黑色。该应用程序由 UINavigationController
和 UIPageViewController
作为 root 组成。这些是在应用程序启动时从情节提要中加载的。
应用程序运行并且 UINavigationBar 显示为不透明。一旦我开始拖动UIPageViewController
,它就会触发某种重绘,UINavigationBar
根据需要变得透明。
我尝试了几种不同的方法将UINavigationBar
设置为透明黑色,但它们都没有产生与描述不同的行为:
-
我在
Info.plist
中设置了这些键:
<key>UIStatusBarTintParameters</key>
<dict>
<key>UINavigationBar</key>
<dict>
<key>Style</key>
<string>UIBarStyleBlack</string>
<key>Translucent</key>
<true/>
</dict>
</dict>
我在didFinishLaunchingWithOptions
的AppDelegate中设置了UINavigationBar
外观:
UINavigationBar.appearance().tintColor = UIColor.black
UINavigationBar.appearance().isTranslucent = true
我将UINavigationController
子类化并在viewDidLoad()
中设置 NavigationBar 属性:
navigationBar.barStyle = .black
navigationBar.isTranslucent = true
navigationBar.setNeedsDisplay()
我在UIPageViewController
(导航控制器的根视图控制器)的viewDidLoad()
中设置了 NavigationBar 属性:
navigationController!.navigationBar.barStyle = .black
navigationController!.navigationBar.isTranslucent = true
navigationController!.navigationBar.setNeedsDisplay()
我还尝试打开/关闭导航栏以触发刷新
navigationController!.isNavigationBarHidden = true
navigationController!.isNavigationBarHidden = false
-
为了完整起见,我在
UIPageViewController
的子视图控制器的viewDidLoad()
中设置了导航栏属性。
在每一种情况下,我都会得到相同的行为:不透明条直到我触摸屏幕并开始拖动,此时它切换为透明。
奇怪的是,设置导航栏的其他属性,例如titleTextAttributes
、leftButtonItem
和rightButtonItem
可以正常工作,并且更改会立即反映。
【问题讨论】:
【参考方案1】:我对 Swift3
有类似的要求,并通过这种方式实现了它:
在包含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
改成你想要的。
在您的 storyboard
中选择您的控制器,然后在属性检查器下使用模拟指标标题将顶部栏设置为导航半透明栏。参考下图:
【讨论】:
感谢您的帮助。请注意,在 Interface Builder 中设置 Simulated Metrics 不会影响应用程序,它仅用于预览,请参阅***.com/a/31949116/1161906。【参考方案2】:这是一种 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()
的调用没有帮助。所以这是一个部分修复。
【讨论】:
以上是关于黑色半透明导航栏在第一次拖动前不透明的主要内容,如果未能解决你的问题,请参考以下文章
黑色半透明导航栏/UITableView/内容插入/滚动位置问题
无法在 tableviewcontroller 上获得半透明导航栏。与视图控制器和 tableview 一起工作正常
Flutter沉浸式状态栏/AppBar导航栏/仿咸鱼底部凸起导航
Flutter沉浸式透明状态栏|flutter自定义凸起BottomAppBar导航