(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
...
}
}
一些可能有用的东西:
- 在调试会话中 (see print screen) => 查看 UI 层次结构:所选项目(标记为 class UITabBarSwappableImageView)具有正确的自定义图像,但色调是默认的蓝色。我尝试了不同的自定义图像,看起来好像它们被另一个(默认?)视图隐藏了...
- 如果我在 AppDelegate.swift application(... didFinishLaunchingWithOptions ...) 函数中更改 UITabBar.appearance().tintColor = UIColor.red 则所选项目具有红色(与蓝色)色调。
发生了什么事?
我扩展了 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上打一个断点:在第二个视图控制器上,你会发现断点没有命中,这就是为什么选项卡项目的图像不会'待更新。
首先,我是 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
...
}
}
一些可能有用的东西:
- 在调试会话中 (see print screen) => 查看 UI 层次结构:所选项目(标记为 class UITabBarSwappableImageView)具有正确的自定义图像,但色调是默认的蓝色。我尝试了不同的自定义图像,看起来好像它们被另一个(默认?)视图隐藏了...
- 如果我在 AppDelegate.swift application(... didFinishLaunchingWithOptions ...) 函数中更改 UITabBar.appearance().tintColor = UIColor.red 则所选项目具有红色(与蓝色)色调。
发生了什么事?
我扩展了 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上打一个断点:在第二个视图控制器上,你会发现断点没有命中,这就是为什么选项卡项目的图像不会'待更新。