(Swift) 选项卡栏项目:未显示渲染为原始图像的自定义选定图像

(Swift) Tab Bar Item: Custom Selected Image with Rendering asOriginal is Not Showing

首先,我是 Swift 的新手,如果我遗漏了一些明显的东西或使用了错误的术语,我们深表歉意。

Objective: 将标签栏项目选择的图像设置为自定义图像。

以下设置有效(所选项目是自定义图像):

| UI标签栏控制器 | => | UIViewController | (带故事板的设置)

class MyViewController: UIViewController {  
    override func viewDidLoad() {
        super.viewDidLoad()
        let customSelectedImage = UIImage (named: "selected-image")?.withRenderingMode(.alwaysOriginal)
        self.tabBarItem.selectedImage = customSelectedImage
    }
}

但此设置不起作用(所选项目具有默认蓝色调):

| UI标签栏控制器 | => | UI导航控制器 | => | UIViewController | (带故事板的设置 - see here)

与上面类似的代码,但(以编程方式)将 UICollectionView 子视图添加到 UIViewController。

class MyViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {  
    override func viewDidLoad() {
        super.viewDidLoad()
        let customSelectedImage = UIImage (named: "selected-image")?.withRenderingMode(.alwaysOriginal)
        self.tabBarItem.selectedImage = customSelectedImage
        ...
        //Some UICollectionView related code
        ...
    }
}

一些可能有用的东西:

发生了什么事?

我扩展了 UITabBarController:

extension UITabBarController {

    func updateTabBarItem(tab: Int, image: UIImage?) {

        guard let tabItems = tabBar.items, tab < tabItems.count && tab >= 0
            else { return }

        let tabItem = tabItems[tab]
        tabItem.image = image?.withRenderingMode(.alwaysOriginal)
        tabItem.selectedImage = tabItem.image

    }

}

这将有助于在不加载任何视图控制器(选项卡 0 的第一个视图控制器除外)的情况下访问 tabBar.items。

class MyViewController: UIViewController {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        tabBarController?.updateTabBarItem(tab: 1, image: UIImage(named: "selected-image")) // update the second tab's image here (just for example)
    }

}

例如,如果你想改变选项卡2选择的图像,在viewDidLoad上打一个断点:在第二个视图控制器上,你会发现断点没有命中,这就是为什么选项卡项目的图像不会'待更新。