【问题标题】:Back UIBarButtonItem appearance remove text and change image返回 UIBarButtonItem 外观删除文本并更改图像
【发布时间】:2018-01-19 18:05:19
【问题描述】:

我看过很多这样的问题,但没有找到我的问题的答案。

我现在就是这样:

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 中为每次出现的后退按钮更改图像、隐藏文本并保持标准的后退动作?

【问题讨论】:

标签: ios uiviewcontroller uinavigationcontroller uibarbuttonitem


【解决方案1】:

为 UINavigationItem 创建一个扩展

extension UINavigationItem {
    func backBarButtonItem() -> UINavigationItem {
        return UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
    }
}

【讨论】:

  • 您好,您阅读主要问题了吗?推送的 viewController 的标题随您的方法移动。
【解决方案2】:

您应该在此观看 Mark Moeykens 的 youtube 系列。恕我直言,他是 Swift 中 UI 设计和实现方面最好的 YouTube 演示者之一。

播放列表为https://www.youtube.com/playlist?list=PLHDMmeIMXj8WyvlX5uFmppVn2Pm0bXVr7

【讨论】:

    【解决方案3】:

    根据https://stackoverflow.com/a/16831482/5790492 的说法,有一种方法可以做到这一点而无需露面。

    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)
        }
    }
    

    【讨论】:

      【解决方案4】:

      我可以建议您 2 个选项。两者都需要 BaseViewController 类作为所有视图控制器的超类。

      1. 如果你对原生后退按钮图像没问题,只想删除后退按钮文本,你可以使用这个子类:

        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 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)
             }
        }
        

      【讨论】:

        【解决方案5】:

        有三种方法可以做你想做的事。

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

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

        3. 从根控制器隐藏默认导航栏,并在所有视图控制器中使用 UIView 和 UIButton 创建自己的导航栏。 (我一直都用这个选项,导航栏的定制对我来说很容易。而且我可以根据自己的需要设置视图)

        【讨论】:

        • 如果你用好的示例代码支持这一点,那将是最好的答案。
        • 好:)。对于哪个选项,您想更进一步(需要代码)?
        • 对于每一个,因为我认为不仅我需要这个功能,而且会看你的答案 =) 特别是 1-st 方式。
        【解决方案6】:

        以下是为导航栏添加自定义按钮的方法

         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)
        

        【讨论】:

        • 你也想要标题?
        • 外观()呢?在每个 UIViewController 类中更改它的方式都不合适。
        • 您可以选择外观,但更喜欢我上面描述的方式,您可以在所有 UIViewcontroller 中创建基本视图控制器和继承
        【解决方案7】:
        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]
        

        试试这段代码并相应地进行更改以设置图像、颜色和其他属性

        【讨论】:

        • 请再次阅读问题并尝试回答。它对文本没有帮助。
        • 要从图像和问题中隐藏标题文本,您可以选择 self.navigationItem.titleView.hidden = YES
        猜你喜欢
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        • 2013-03-27
        相关资源
        最近更新 更多