iOS: 只隐藏一个 viewcontroller 的导航栏,它是 UINavigationController 的根目录?
iOS: Hide the navigation bar for only one viewcontroller which is root of the UINavigationController?
我只想隐藏一个 viewcontroller 的导航栏,它是 UINavigationController 的根 viewcontroller。
目前我正在使用下面的代码来隐藏特定 viewcontroller 的导航栏。
- 要隐藏导航栏,
override func viewWillAppear(_ animated: Bool) {
self.navigationController?.isNavigationBarHidden = true
super.viewWillAppear(animated)
}
- 为其他 viewcontroller 显示导航栏,
override func viewWillDisappear(_ animated: Bool) {
self.navigationController?.isNavigationBarHidden = false
super.viewWillDisappear(animated)
}
当我尝试使用此代码时,应用程序在 iOS 13 台设备中崩溃,原因是线程违规:预期是主线程。
请检查我使用上面的代码隐藏导航栏时遇到的问题,
iOS 13: threading violation: expected the main thread
请告诉我是否有任何其他方法可以仅隐藏一个导航栏 viewcontroller。
您可以在调用 viewWillApper 时使其透明(完全不可见),并在调用 view willDisappear 时使其恢复正常。这是辅助函数。
func makeNaBarTransparent() {
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
}
func restoreNavigationBarToDefault() {
navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.shadowImage = nil
}
用法
import UIKit
class ViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
makeNaBarTransparent()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
restoreNavigationBarToDefault()
}
}
import UIKit
class ViewController: UIViewController {
override func viewWillAppear(_ animated: Bool){
super.viewWillAppear(animated)
self.navigationController?.isNavigationBarHidden = true
}
override func viewWillDisappear(_ animated: Bool){
super.viewWillDisappear(animated)
self.navigationController?.isNavigationBarHidden = false
}
}
我从我的一个朋友那里得到了 hide/show 导航栏的另一种方式。
- 为 NavigationController 设置委托:
navigationController.delegate = self
- Hide/Show 每个导航栏 ViewController 都在一个地方
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
let hide = (viewController is YourVC)
navigationController.setNavigationBarHidden(hide, animated: animated)
}
我只想隐藏一个 viewcontroller 的导航栏,它是 UINavigationController 的根 viewcontroller。
目前我正在使用下面的代码来隐藏特定 viewcontroller 的导航栏。
- 要隐藏导航栏,
override func viewWillAppear(_ animated: Bool) {
self.navigationController?.isNavigationBarHidden = true
super.viewWillAppear(animated)
}
- 为其他 viewcontroller 显示导航栏,
override func viewWillDisappear(_ animated: Bool) {
self.navigationController?.isNavigationBarHidden = false
super.viewWillDisappear(animated)
}
当我尝试使用此代码时,应用程序在 iOS 13 台设备中崩溃,原因是线程违规:预期是主线程。
请检查我使用上面的代码隐藏导航栏时遇到的问题,
iOS 13: threading violation: expected the main thread
请告诉我是否有任何其他方法可以仅隐藏一个导航栏 viewcontroller。
您可以在调用 viewWillApper 时使其透明(完全不可见),并在调用 view willDisappear 时使其恢复正常。这是辅助函数。
func makeNaBarTransparent() {
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = true
}
func restoreNavigationBarToDefault() {
navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.shadowImage = nil
}
用法
import UIKit
class ViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
makeNaBarTransparent()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
restoreNavigationBarToDefault()
}
}
import UIKit
class ViewController: UIViewController {
override func viewWillAppear(_ animated: Bool){
super.viewWillAppear(animated)
self.navigationController?.isNavigationBarHidden = true
}
override func viewWillDisappear(_ animated: Bool){
super.viewWillDisappear(animated)
self.navigationController?.isNavigationBarHidden = false
}
}
我从我的一个朋友那里得到了 hide/show 导航栏的另一种方式。
- 为 NavigationController 设置委托:
navigationController.delegate = self
- Hide/Show 每个导航栏 ViewController 都在一个地方
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
let hide = (viewController is YourVC)
navigationController.setNavigationBarHidden(hide, animated: animated)
}