返回 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)

您可以通过三种方式来完成您想要的事情。

  1. 我建议:通过扩展和 UINavigationController 创建您自己的导航 Class 并覆盖 backbuttonItem (UIBarButtonItem) 属性 以根据您的要求对其进行自定义。并在您的项目中使用相同的导航控制器 class。

  2. 通过扩展 UIBarButtonItem 创建自定义 backBarButton,并在所有视图控制器中手动将其设置为默认 Navigation Controller class 的后退按钮。

  3. 隐藏根控制器的默认导航栏,并在所有视图控制器中使用 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。

  1. 如果您对原生后退按钮图像没问题,只想删除后退按钮文本,您可以使用此子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 = ""
        }
    }
    
  2. 如果你想为后退按钮使用你的自定义图标,你应该用你的图像创建 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)
    }
}