setTintColor 和 setSelectedImageTintColor 不能一起正常工作
Posted
技术标签:
【中文标题】setTintColor 和 setSelectedImageTintColor 不能一起正常工作【英文标题】:setTintColor and setSelectedImageTintColor are not working properly together 【发布时间】:2015-06-25 06:32:57 【问题描述】:我正在尝试更改我的自定义标签栏的标签栏项目的图标颜色,
但是setSelectedImageTintColor
和setTintColor
不能一起工作。
如果代码顺序是
[[UITabBar appearance] setSelectedImageTintColor:[UIColor greenColor]];
[[UITabBar appearance] setTintColor:[UIColor redColor]];
那么输出是
如果代码顺序是
[[UITabBar appearance] setTintColor:[UIColor redColor]];
[[UITabBar appearance] setSelectedImageTintColor:[UIColor greenColor]];
那么输出是
我在didFinishLaunchingWithOptions
方法中使用了以下代码,前两行工作正常,问题出在最后两行
//To set color for unselected tab bar item's title color
[[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIColor redColor], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal];
//To set color for selected tab bar item's title color
[[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor greenColor], NSForegroundColorAttributeName,nil] forState:UIControlStateSelected];
//To set color for unselected icons
[[UITabBar appearance] setTintColor:[UIColor redColor]];
//To set color for selected icons
[[UITabBar appearance] setSelectedImageTintColor:[UIColor greenColor]];
注意 - 我有单独的自定义标签栏类,但我没有更改自定义标签栏类中的图标颜色
感谢期待。
【问题讨论】:
【参考方案1】:首先,selectedImageTintColor
自 ios 8.0 起已弃用。
我设法实现您想要的唯一方法是为选定和未选定状态分别使用图像,并分别使用UITabBbarItem
的selectedImage
和image
属性。
重要提示:默认情况下,这两个图像属性都呈现为“模板”,这意味着它们是根据源图像中的 alpha 值创建的,因此会从 tabBar 的 tintColor 中获取它们的颜色.
为防止出现这种情况,请使用UIImageRenderingModeAlwaysOriginal
提供图像。
所以,为了得到你想要的,你需要拥有所有标签栏图像的两个版本,一个红色(用于未选择状态)和一个绿色(用于选定状态),然后执行以下操作:
示例(快速):
tabBarItem1.image = UIImage(named:"redHouse")?.imageWithRenderingMode(.AlwaysOriginal)
tabBarItem1.selectedImage = UIImage(named:"greenHouse")?.imageWithRenderingMode(.AlwaysOriginal)
示例(目标-c):
[tabBarItem1 setImage:[[UIImage imageNamed:@"redHouse"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
[tabBarItem2 setSelectedImage:[[UIImage imageNamed:@"greenHouse"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
【讨论】:
首先,感谢您的回答。供您参考,我使用的是 iOS 7,如果我使用UIImageRenderingModeAlwaysOriginal
,它将始终显示原始图像,但我想更改标签栏项目的图标颜色与标签栏项目的标题颜色相同,用于选中和未选中
是的,但是即使你使用 iOS7,tintColor 和 selectedImageTintColor 也不足以真正改变 unselected 状态的图标颜色。另请注意,tintColor
实际上更改了 selected 状态的标题和图标颜色。所以tintColor
和selectedImageTintColor
之间的唯一区别是第二个不会改变标题颜色(selected tabbarItem)
我编辑了我的原始答案,所以现在我的意思可能更清楚了吗?
在 iOS7 中使用 tint color 来实现这一点简直是不可能,你链接的问题给出了相同的答案。
@pIkEL 我们需要在程序的什么地方编写这段代码?以上是关于setTintColor 和 setSelectedImageTintColor 不能一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章
自定义 UITableViewCell 和 setSelected:animated 上的动画:
Swift - UIButton 覆盖 setSelected
在 iOS 13 和 xcode 11 中,tableview 单元格的“setSelected”方法不返回完美的单元格大小
如何让 UITableViewCell 在自定义 UIView 子类上调用 setHighlighted 或 setSelected?