创建自定义 UINavigationcontroller class
Create a custom UINavigationcontroller class
我已经对我的嵌入式 UINavigationcontroller 进行了以下自定义。我在将首先显示的视图的视图控制器中完成了此操作。
但是我正在尝试通过创建一个单独的 class 来清理它,以便我的 UIView class 中没有这一切。我目前使用的代码
self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navigation.background"), for: .default)
let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal)
let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal)
self.navigationController?.navigationBar.backIndicatorImage = backButton
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = backButtonHigh
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
我尝试做的是像这样 class 在新的 class 中扩展 UInavigationcontroller
class RSRNavigationController: UINavigationController{
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navigation.background"), for: .default)
let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal)
let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal)
self.navigationController?.navigationBar.backIndicatorImage = backButton
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = backButtonHigh
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
这行不通。它会 运行 没有问题,但它实际上不会做任何事情。
我也尝试过以下操作
class RSRNavigationController: UINavigationBar{
override func draw(_ rect: CGRect) {
super.draw(rect)
self.setBackgroundImage(UIImage(named: "navigation.background"), for: .default)
let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal)
let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal)
self.backIndicatorImage = backButton
self.backIndicatorTransitionMaskImage = backButtonHigh
//self.backItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
但是我似乎无法设置后退按钮的标题。
有人知道如何解决这个问题吗?
您的问题出在这里,当您在自定义导航控制器中引用导航控制器时 class
而不是做
self.navigationController?.navigationBar.backIndicatorImage = backButton
这样做
self.navigationBar.backIndicatorImage = backButton
原因?
因为当您通过 UINavigationController 扩展自定义 class 时,它本身就变成了导航控制器。通过执行 self.navigationController,您告诉您的应用程序寻找您的自定义 navigationCOntroller 所在的 navigationController。当然,这样的导航控制器不存在,因为您的自定义 navController 是应用程序的主要或顶部 navController。因此,只需从您的自定义 class 中删除 self.navigationController 部分,您在 viewDidLoad 中编写的其余代码应该可以正常工作。
如果还有什么问题欢迎随时提问
您不会在导航控制器本身中更改这些属性,而是在嵌入在导航控制器中的 viewController 中更改它。
这些自定义必须在视图控制器的父级 ViewController
中完成。
这个答案有更多信息:
如果您只想自定义导航栏的后退按钮,您可以在您的子视图控制器中添加此代码:
func setupLeftBarItem() -> Void {
let originalImage = UIImage.init(named: "leftBatItem")?.withRenderingMode(.alwaysOriginal)
let leftBarItem = UIBarButtonItem.init(image: originalImage, style: .done, target: self, action: #selector(leftBarButtonItemDidTouch))
navigationItem.leftBarButtonItem = leftBarItem
}
func leftBarButtonItemDidTouch() -> Void {
_ = navigationController?.popViewController(animated: true)
}
我已经对我的嵌入式 UINavigationcontroller 进行了以下自定义。我在将首先显示的视图的视图控制器中完成了此操作。
但是我正在尝试通过创建一个单独的 class 来清理它,以便我的 UIView class 中没有这一切。我目前使用的代码
self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navigation.background"), for: .default)
let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal)
let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal)
self.navigationController?.navigationBar.backIndicatorImage = backButton
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = backButtonHigh
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
我尝试做的是像这样 class 在新的 class 中扩展 UInavigationcontroller
class RSRNavigationController: UINavigationController{
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: "navigation.background"), for: .default)
let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal)
let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal)
self.navigationController?.navigationBar.backIndicatorImage = backButton
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = backButtonHigh
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
这行不通。它会 运行 没有问题,但它实际上不会做任何事情。
我也尝试过以下操作
class RSRNavigationController: UINavigationBar{
override func draw(_ rect: CGRect) {
super.draw(rect)
self.setBackgroundImage(UIImage(named: "navigation.background"), for: .default)
let backButton = UIImage(named: "Back.button")?.withRenderingMode(.alwaysOriginal)
let backButtonHigh = UIImage(named: "Back.button.highlighted")?.withRenderingMode(.alwaysOriginal)
self.backIndicatorImage = backButton
self.backIndicatorTransitionMaskImage = backButtonHigh
//self.backItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
但是我似乎无法设置后退按钮的标题。
有人知道如何解决这个问题吗?
您的问题出在这里,当您在自定义导航控制器中引用导航控制器时 class
而不是做
self.navigationController?.navigationBar.backIndicatorImage = backButton
这样做
self.navigationBar.backIndicatorImage = backButton
原因?
因为当您通过 UINavigationController 扩展自定义 class 时,它本身就变成了导航控制器。通过执行 self.navigationController,您告诉您的应用程序寻找您的自定义 navigationCOntroller 所在的 navigationController。当然,这样的导航控制器不存在,因为您的自定义 navController 是应用程序的主要或顶部 navController。因此,只需从您的自定义 class 中删除 self.navigationController 部分,您在 viewDidLoad 中编写的其余代码应该可以正常工作。
如果还有什么问题欢迎随时提问
您不会在导航控制器本身中更改这些属性,而是在嵌入在导航控制器中的 viewController 中更改它。
这些自定义必须在视图控制器的父级 ViewController
中完成。
这个答案有更多信息:
如果您只想自定义导航栏的后退按钮,您可以在您的子视图控制器中添加此代码:
func setupLeftBarItem() -> Void {
let originalImage = UIImage.init(named: "leftBatItem")?.withRenderingMode(.alwaysOriginal)
let leftBarItem = UIBarButtonItem.init(image: originalImage, style: .done, target: self, action: #selector(leftBarButtonItemDidTouch))
navigationItem.leftBarButtonItem = leftBarItem
}
func leftBarButtonItemDidTouch() -> Void {
_ = navigationController?.popViewController(animated: true)
}