首页 文章

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

提问于
浏览
4

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

我试图改变tabaritem( UITabBarItem )'s image but it didn'为我工作 . 这可行吗?我与我的同事讨论过,他说我可能要自己在tabbarItem上绘制图像 . 你有什么建议吗?谢谢

更多细节:

  • 我使用InterfaceBuilder创建了tabItem,并在那里设置了图像和 Headers

  • 我需要支持ios4 . 所以我不能使用setSelectedImage ...

  • 在我的情况下,它是一个KVO,如果购物车数量发生变化,它会通知方法更新图像 . 不在初始化步骤中 .

有谁知道为什么 [self.tabBarItem setImage:[UIImage imageNamed:@"cartxxx.png"]] 不起作用?当我调试时,属性确实发生了变化,但UI保持不变

Update

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

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

7 回答

  • 5
    - (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];
    
  • 2

    适用于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
    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"];
    
  • 0

    试试这个:

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

    这个答案可能会帮助你

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

    如更新的问题和其他答案所述,在大多数情况下,需要直接通过 UITabBarController 访问 UITabBarItem .

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

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

相关问题