如何以编程方式更改 tabbarItem 的图像
Posted
技术标签:
【中文标题】如何以编程方式更改 tabbarItem 的图像【英文标题】:how to programmatically change the tabbarItem's image 【发布时间】:2012-01-13 07:57:16 【问题描述】:我正在开发一个购物车标签。最初我只是使用默认的徽章值来显示底部标签栏上的购物车中有多少商品。现在设计师想要花哨,他想根据购物车中的商品数量显示不同的图像。例如,如果有一个,显示cartTab-1.png,如果有2,显示cartTab-2.png...
我尝试更改tabaritem (UITabBarItem
) 的图像,但它对我不起作用。可行吗?我和我的同事讨论过,他说我可能必须自己在 tabbarItem 顶部绘制图像。你有什么建议吗?谢谢
更多细节:
-
我使用InterfaceBuilder创建了tabItem,并在那里设置了图片和标题
我需要支持ios4。所以我不能使用 setSelectedImage...
在我的例子中,它是一个 KVO,如果购物车数量发生变化,它会通知更新图像的方法。不在初始化步骤中。
有人知道为什么[self.tabBarItem setImage:[UIImage imageNamed:@"cartxxx.png"]]
不起作用吗?当我调试时,属性确实发生了变化,但 UI 保持不变
更新
以下代码有效。谢谢大家!
UIImage* cartTabImage = [UIImage imageNamed:cartTabImageName];
[[self.tabBarController.tabBar.items objectAtIndex:3] setImage:cartTabImage];
【问题讨论】:
【参考方案1】:Swift 3.0 版本,用于 2 个选项卡,
self.tabBar.items?[0].image = UIImage(named: "inactive_image_0")?.withRenderingMode(.alwaysOriginal)
self.tabBar.items?[0].selectedImage = UIImage(named: "active_image_0")?.withRenderingMode(.alwaysOriginal)
self.tabBar.items?[1].image = UIImage(named: "inactive_image_1")?.withRenderingMode(.alwaysOriginal)
self.tabBar.items?[1].selectedImage = UIImage(named: "active_image_1")?.withRenderingMode(.alwaysOriginal)
【讨论】:
.withRenderingMode(.alwaysOriginal) 真的帮助了我。【参考方案2】:UITabBarItem *tabBarItem0 = [self.tabBarController.tabBar.items objectAtIndex:0];
[tabBarItem0 setImage:[[UIImage imageNamed:@"iconGray.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
[tabBarItem0 setSelectedImage:[[UIImage imageNamed:@"iconBlue.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
【讨论】:
【参考方案3】:我发现的最简单的方法是
self.tabBarItem.image=[UIImage imageNamed:@"myImage.png"];
【讨论】:
self.tabBarItem
不一定非空。
这不是设置 selectedImage 并且无法正常工作。【参考方案4】:
试试这个:
int numItems = 0; // count of items in your shopping cart
NSString *imageName = [NSString stringWithFormat:@"cartTab-%d",numItems];
// change your image
[[self.tabBar.items objectAtIndex:myIndex] setImage:[UIImage imageNamed:imageName]];
// or, if you want to set it when initializing the tabBar
UITabBarItem *item = [[[UITabBarItem alloc] initWithTitle:myTitle image:[UIImage imageNamed:imageName] tag:someTag];
【讨论】:
谢谢。实际上我做了同样的事情,但图像没有改变。调试时,tabBarItem 的属性更改为新图像。但是由于某种原因,UI 没有更新。以下均无效: [self.tabBarItem setImage:[UIImage imageNamed:@"play.png"]]; [self.tabBarItem setBadgeValue:@"4"]; [self.tabBarItem setTitle:@"test"];顺便说一句,我是在 viewDidLoad 中完成的。【参考方案5】:这个答案可能对你有帮助
UITabBarItem *i5=[[UITabBarItem alloc]initWithTitle:@"Profile" image:[UIImage imageNamed:@"profile.png"] tag:5];
【讨论】:
谢谢 在我的情况下,它是一个 KVO,如果购物车数量发生变化,它会通知更新图像的方法。不在初始化步骤中【参考方案6】:- (void)setFinishedSelectedImage:(UIImage *)selectedImage withFinishedUnselectedImage:(UIImage *)unselectedImage
selectedImage 在用户选择选项卡时显示。当用户选择了不同的选项卡时,会显示 unselectedImage。
在你的viewDidLoad:
做
UIImage *c1 = [UIImage imageNamed:@"cart1.png"];
UIImage *c2 = [UIImage imageNamed:@"cart1unselected.png"];
[[self tabBarItem] setFinishedSelectedImage:c1 withFinishedUnselectedImage:c2];
【讨论】:
谢谢 由于我需要支持ios 4,所以我调用了类似的代码,但它不起作用。 [self.tabBarItem setImage:[UIImage imageNamed:@"cartxxx.png"]];我也不在 viewDidLoad 中调用它。在我的例子中,它是一个 KVO,如果购物车数量发生变化,它会通知更新图像的方法。 这是一个iOS5的方法。如果你需要支持 iOS4,你将不得不继承 UITabBar 并创建自定义图像代码......它很烦人并且非常长并且可能会变得非常错误。有关于如何将自定义图像添加到 UITabBar 的教程【参考方案7】:如更新的问题和其他答案中所述,在大多数情况下,UITabBarItem
需要直接通过UITabBarController
访问。
iOS 似乎创建了UITabBarItem
实例的副本,这就解释了为什么更新self.tabBarItem
属性不会反映用户界面中的更改:
我的猜测是,当 Tab Bar 项目以编程方式而不是情节提要创建时会发生这种情况,但这只是一个猜测。
然后,正如所指出的,解决方案是通过 Tab Bar 控制器访问 Tab Bar 项目数组。这个解决方案不好,因为它依赖于标签栏项索引的知识:
UITabBarItem *tabBarItem = [self.tabBarController.tabBar.items objectAtIndex:0];
[tabBarItem setImage:image];
[tabBarItem setSelectedImage:image];
不要忘记更新默认和选定状态的图像。
【讨论】:
【参考方案8】:let favorites = UITabBarItem(title: nil, image:UIImage(named: "Screen Shot 2018-12-13 at 11.00.42 AM") , tag: 0)
【讨论】:
以上是关于如何以编程方式更改 tabbarItem 的图像的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式将 UITabBarController 中 TabBarItem 中的图标居中