返回 UIBarButtonItem 外观删除文本并更改图像
Back UIBarButtonItem appearance remove text and change image
我看了很多这样的问题,但没有找到我的问题的答案。
我现在是怎么做的:
APPDELEGATE (didFinishLaunchingWithOptions)
// Text
let barButtonItem = UIBarButtonItem.appearance()
barButtonItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: UIControlState.normal)
barButtonItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: UIControlState.highlighted)
// Image
let backImage = UIImage(named: "arrow_left"
UINavigationBar.appearance().backIndicatorImage = backImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage
这几乎符合我的需要,但屏幕标题向右移动,因为有一个不可见的后退按钮文本。它绝对是(根控制器的标题有 9 个字符长度):
问题是:如何在 ios 9.0 中为每次出现的后退按钮更改图像、隐藏文本并保持标准后退操作?
UINavigationBar.appearance().setBackgroundImage(UIImage(), for:
UIBarPosition.any, barMetrics: UIBarMetrics.default)
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().barTintColor = UIColor.main
UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().clipsToBounds = false
UINavigationBar.appearance().backgroundColor = UIColor.main
UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName :
(UIFont(name: "Helvetica", size: 18))!, NSForegroundColorAttributeName:
UIColor.white]
尝试此代码并进行相应更改以设置图像、颜色和其他属性
这是为导航栏添加自定义按钮的方法
let btnleft : UIButton = UIButton(frame: CGRect(x:0, y:0, width:35, height:35))
btnleft.contentMode = .center
btnleft.setImage(Set_Local_Image("arrow_left"), for: .normal)
btnleft.addTarget(self, action: #selector(YOUR_ACTION), for: .touchDown)
let backBarButon: UIBarButtonItem = UIBarButtonItem(customView: btnleft)
self.navigationItem.setLeftBarButtonItems([menuBarButon], animated:false)
而不是 "arrow_left" 您可以使用任何您想要的图像
对于默认后退操作,您可以创建函数(YOUR_ACTION)并在后退按钮的选择器中使用
navController.popViewController(animated: true)
您可以通过三种方式来完成您想要的事情。
我建议:通过扩展和 UINavigationController 创建您自己的导航 Class 并覆盖 backbuttonItem (UIBarButtonItem) 属性 以根据您的要求对其进行自定义。并在您的项目中使用相同的导航控制器 class。
通过扩展 UIBarButtonItem 创建自定义 backBarButton,并在所有视图控制器中手动将其设置为默认 Navigation Controller class 的后退按钮。
隐藏根控制器的默认导航栏,并在所有视图控制器中使用 UIView 和 UIButton 创建您自己的导航栏。 (我一直使用这个选项,这使得自定义导航栏对我来说非常容易。我可以根据自己的需要设置我的视图)
根据 有一种方法可以做到这一点而不用出现。
Swift 3.0
extension UIViewController {
func setupCustomBackButton() {
if let controllersCount = navigationController?.viewControllers.count, controllersCount > 1 {
let backButton = UIButton(frame: CGRect(x: 0, y: 0, width: 12, height: 20))
backButton.setBackgroundImage(UIImage(named: "arrow_left"), for: .normal)
backButton.contentMode = .left
let backButtonItem = UIBarButtonItem(customView: backButton)
backButton.addTarget(self, action: #selector(self.popCurrentViewController), for: .touchUpInside)
navigationItem.leftBarButtonItem = backButtonItem
navigationItem.hidesBackButton = true
}
}
func popCurrentViewController() {
navigationController?.popViewController(animated: true)
}
}
我可以向您推荐 2 个选项。两者都需要 BaseViewController class 作为所有视图控制器的超级 class。
如果您对原生后退按钮图像没问题,只想删除后退按钮文本,您可以使用此子class:
class BaseViewController: UIViewController {
var navigationTitle: String = ""
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if !navigationTitle.isEmpty {
navigationItem.title = navigationTitle
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationTitle = navigationItem.title ?? ""
navigationItem.title = ""
}
}
如果你想为后退按钮使用你的自定义图标,你应该用你的图像创建 UIBarButtonItem,添加目标,选择器,处理按钮的动作。下面的示例 BaseViewController class:
class BaseViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let backImage = UIImage(named: "arrow_left")
navigationItem.hidesBackButton = true
guard let navigationController = navigationController else {
return
}
if navigationController.viewControllers.count > 1 {
// we have to set back button only when we have at least 1 controller to go back
navigationItem.leftBarButtonItem = UIBarButtonItem(image: backImage, style: .plain, target: self, action: #selector(backBarButtonAction(sender:)))
}
}
// MARK: Actions
func backBarButtonAction(sender: UIBarButtonItem) {
navigationController?.popViewController(animated: true)
}
}
你应该观看 Mark Moeykens 的 youtube 系列。恕我直言,他是 UI 在 Swift 中设计和实施的最佳 YouTube 主持人之一。
播放列表是https://www.youtube.com/playlist?list=PLHDMmeIMXj8WyvlX5uFmppVn2Pm0bXVr7
Create an extension for UINavigationItem
extension UINavigationItem {
func backBarButtonItem() -> UINavigationItem {
return UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}
}
我看了很多这样的问题,但没有找到我的问题的答案。
我现在是怎么做的:
APPDELEGATE (didFinishLaunchingWithOptions)
// Text
let barButtonItem = UIBarButtonItem.appearance()
barButtonItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: UIControlState.normal)
barButtonItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: UIControlState.highlighted)
// Image
let backImage = UIImage(named: "arrow_left"
UINavigationBar.appearance().backIndicatorImage = backImage
UINavigationBar.appearance().backIndicatorTransitionMaskImage = backImage
这几乎符合我的需要,但屏幕标题向右移动,因为有一个不可见的后退按钮文本。它绝对是(根控制器的标题有 9 个字符长度):
问题是:如何在 ios 9.0 中为每次出现的后退按钮更改图像、隐藏文本并保持标准后退操作?
UINavigationBar.appearance().setBackgroundImage(UIImage(), for:
UIBarPosition.any, barMetrics: UIBarMetrics.default)
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().barTintColor = UIColor.main
UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().clipsToBounds = false
UINavigationBar.appearance().backgroundColor = UIColor.main
UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName :
(UIFont(name: "Helvetica", size: 18))!, NSForegroundColorAttributeName:
UIColor.white]
尝试此代码并进行相应更改以设置图像、颜色和其他属性
这是为导航栏添加自定义按钮的方法
let btnleft : UIButton = UIButton(frame: CGRect(x:0, y:0, width:35, height:35))
btnleft.contentMode = .center
btnleft.setImage(Set_Local_Image("arrow_left"), for: .normal)
btnleft.addTarget(self, action: #selector(YOUR_ACTION), for: .touchDown)
let backBarButon: UIBarButtonItem = UIBarButtonItem(customView: btnleft)
self.navigationItem.setLeftBarButtonItems([menuBarButon], animated:false)
而不是 "arrow_left" 您可以使用任何您想要的图像
对于默认后退操作,您可以创建函数(YOUR_ACTION)并在后退按钮的选择器中使用
navController.popViewController(animated: true)
您可以通过三种方式来完成您想要的事情。
我建议:通过扩展和 UINavigationController 创建您自己的导航 Class 并覆盖 backbuttonItem (UIBarButtonItem) 属性 以根据您的要求对其进行自定义。并在您的项目中使用相同的导航控制器 class。
通过扩展 UIBarButtonItem 创建自定义 backBarButton,并在所有视图控制器中手动将其设置为默认 Navigation Controller class 的后退按钮。
隐藏根控制器的默认导航栏,并在所有视图控制器中使用 UIView 和 UIButton 创建您自己的导航栏。 (我一直使用这个选项,这使得自定义导航栏对我来说非常容易。我可以根据自己的需要设置我的视图)
根据 有一种方法可以做到这一点而不用出现。
Swift 3.0
extension UIViewController {
func setupCustomBackButton() {
if let controllersCount = navigationController?.viewControllers.count, controllersCount > 1 {
let backButton = UIButton(frame: CGRect(x: 0, y: 0, width: 12, height: 20))
backButton.setBackgroundImage(UIImage(named: "arrow_left"), for: .normal)
backButton.contentMode = .left
let backButtonItem = UIBarButtonItem(customView: backButton)
backButton.addTarget(self, action: #selector(self.popCurrentViewController), for: .touchUpInside)
navigationItem.leftBarButtonItem = backButtonItem
navigationItem.hidesBackButton = true
}
}
func popCurrentViewController() {
navigationController?.popViewController(animated: true)
}
}
我可以向您推荐 2 个选项。两者都需要 BaseViewController class 作为所有视图控制器的超级 class。
如果您对原生后退按钮图像没问题,只想删除后退按钮文本,您可以使用此子class:
class BaseViewController: UIViewController { var navigationTitle: String = "" override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if !navigationTitle.isEmpty { navigationItem.title = navigationTitle } } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) navigationTitle = navigationItem.title ?? "" navigationItem.title = "" } }
如果你想为后退按钮使用你的自定义图标,你应该用你的图像创建 UIBarButtonItem,添加目标,选择器,处理按钮的动作。下面的示例 BaseViewController class:
class BaseViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let backImage = UIImage(named: "arrow_left") navigationItem.hidesBackButton = true guard let navigationController = navigationController else { return } if navigationController.viewControllers.count > 1 { // we have to set back button only when we have at least 1 controller to go back navigationItem.leftBarButtonItem = UIBarButtonItem(image: backImage, style: .plain, target: self, action: #selector(backBarButtonAction(sender:))) } } // MARK: Actions func backBarButtonAction(sender: UIBarButtonItem) { navigationController?.popViewController(animated: true) } }
你应该观看 Mark Moeykens 的 youtube 系列。恕我直言,他是 UI 在 Swift 中设计和实施的最佳 YouTube 主持人之一。
播放列表是https://www.youtube.com/playlist?list=PLHDMmeIMXj8WyvlX5uFmppVn2Pm0bXVr7
Create an extension for UINavigationItem
extension UINavigationItem {
func backBarButtonItem() -> UINavigationItem {
return UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
}
}