2012-01-13 203 views
4

我正在开发购物车选项卡。最初,我只是使用默认徽章值来显示购物车底部的标签栏中有多少物品。现在,设计师想要变得有趣,他想根据购物车中的物品显示不同的图像。例如,如果有一个,显示cartTab-1.png,如果是2,显示cartTab-2.png ...如何以编程方式更改tabbarItem的图像

我试图更改tabaritem(UITabBarItem)的图像,但它不适用于我。这可行吗?我与我的同事讨论过,他说我可能必须自己在tabbarItem的顶部绘制图像。你有什么建议吗?由于

更多细节:

  1. 我创建使用的InterfaceBuilder的的TabItem,并设置图像和标题那边
  2. 我需要支持iOS4的。所以我不能使用setSelectedImage ...
  3. 在我的情况下,它是一个KVO,如果购物车的数量发生变化,它会通知更新图像的方法。不在初始化步骤中。

没有人知道为什么[self.tabBarItem setImage:[UIImage imageNamed:@"cartxxx.png"]]不起作用?当我调试,物业做改变,但是UI会保持相同的

更新

下面的代码工作。感谢大家!

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

回答

1

这个答案可能是帮助你

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

谢谢 在我的情况下,它是一个KVO,如果购物车的数量发生变化,它会通知更新图像的方法。不在初始化步骤 – 2012-01-14 01:48:44

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

谢谢。其实我做了同样的事情,但图像没有改变。当我调试时,tabBarItem的属性更改为新图像。但由于某种原因,用户界面不会更新。下面没有任何工作: [self.tabBarItem setImage:[UIImage imageNamed:@“play.png”]]; [self.tabBarItem setBadgeValue:@“4”]; [self.tabBarItem setTitle:@“test”]; 顺便说一句,我在viewDidLoad中做到了。 – 2012-01-13 22:20:20

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

谢谢 由于我需要支持ios 4,我打电话给类似的代码,但它没有工作。 [self.tabBarItem setImage:[UIImage imageNamed:@“cartxxx.png”]]; 我不会在viewDidLoad中调用它。在我的情况下,这是一个KVO,如果购物车数量发生变化,它会通知更新图像的方法。 – 2012-01-14 01:46:20

+0

这是一个iOS5方法。如果你需要支持iOS4,你将不得不继承UITabBar的子类并创建自定义图像代码......它很烦人,而且时间很长,可能会出现很多bug。有关于如何将自定义图像添加到UITabBar的教程 – ColdLogic 2012-01-15 04:04:19

3

,我发现最简单的方法是

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

'self.tabBarItem'不一定非空。 – Raptor 2014-04-30 06:14:40

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

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

雨燕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) 
0

随着更新的提及问题和其他在大多数情况下,需要通过UITabBarController直接访问UITabBarItem

看来,iOS的创建UITabBarItem实例的副本,这可以解释为什么更新self.tabBarItem属性不会反映在用户界面的变化:

Two UITabBarItem instances

我的猜测是,这发生在当选项卡栏项目是以编程方式创建的,而不是由故事板创建的,但这仅仅是一种猜测。

然后,正如所指出的,解决方案是通过Tab Bar控制器访问Tab Bar项目数组。该解决方案是坏的,因为它依赖于标签栏项指标的知识:

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

不要忘了更新默认和选中状态,两个图像。

相关问题