如何以编程方式更改tabbarItem的图像

时间:2012-01-13 07:57:16

标签: ios uitabbar

我正在开发购物车标签。最初我只是使用默认徽章值来显示底部标签栏中购物车中的项目数。现在设计师想要看上去,他想根据购物车中的物品数量显示不同的图像。例如,如果有,请显示cartTab-1.png,如果为2,则显示cartTab-2.png ...

我试图更改tabaritem(UITabBarItem)的图像,但它对我不起作用。这可行吗?我与我的同事讨论过,他说我可能要自己在tabbarItem上绘制图像。你有什么建议吗?谢谢

更多详情:

  1. 我使用InterfaceBuilder创建了tabItem,并在那里设置了图像和标题
  2. 我需要支持ios4。所以我不能使用setSelectedImage ...
  3. 在我的情况下,它是KVO,如果购物车数量发生变化,它会通知方法更新图像。不在初始化步骤中。
  4. 有谁知道为什么[self.tabBarItem setImage:[UIImage imageNamed:@"cartxxx.png"]]不起作用?当我调试时,属性确实发生了变化,但UI保持不变

    更新

    以下代码有效。感谢大家!

    UIImage* cartTabImage = [UIImage imageNamed:cartTabImageName];
    [[self.tabBarController.tabBar.items objectAtIndex:3] setImage:cartTabImage];
    

8 个答案:

答案 0 :(得分:8)

适用于2个标签的Swift 3.0版本,

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)

答案 1 :(得分:6)

UITabBarItem *tabBarItem0 = [self.tabBarController.tabBar.items objectAtIndex:0];

[tabBarItem0 setImage:[[UIImage imageNamed:@"iconGray.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
[tabBarItem0 setSelectedImage:[[UIImage imageNamed:@"iconBlue.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];

答案 2 :(得分:3)

我找到的最简单的方法是

     self.tabBarItem.image=[UIImage imageNamed:@"myImage.png"];

答案 3 :(得分:2)

试试这个:

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];

答案 4 :(得分:1)

此答案可能会帮助您

  UITabBarItem *i5=[[UITabBarItem alloc]initWithTitle:@"Profile" image:[UIImage imageNamed:@"profile.png"] tag:5];

答案 5 :(得分:1)

- (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];

答案 6 :(得分:0)

正如更新后的问题及其他答案中所述,在大多数情况下,UITabBarItem需要直接通过UITabBarController进行访问。

似乎iOS创建了UITabBarItem实例的副本,这解释了为什么更新self.tabBarItem属性并不反映用户界面中的更改:

Two UITabBarItem instances

我的猜测是,当Tab Bar项目是以编程方式而不是故事板创建的时候会发生这种情况,但这只是猜测。

然后,正如所指出的那样,解决方案是通过Tab Bar控制器访问Tab Bar项目数组。这个解决方案很糟糕,因为它取决于标签栏项目索引的知识:

UITabBarItem *tabBarItem = [self.tabBarController.tabBar.items objectAtIndex:0];
[tabBarItem setImage:image];
[tabBarItem setSelectedImage:image];

不要忘记更新默认和选定状态的图像。

答案 7 :(得分:0)

let favorites = UITabBarItem(title: nil, image:UIImage(named: "Screen Shot 2018-12-13 at 11.00.42 AM") , tag: 0)