2012-01-13 3 views
4

Я разрабатываю вкладку корзины покупок. Первоначально я просто использую значение значка по умолчанию, чтобы показать, сколько элементов в корзине на нижней вкладке. Теперь дизайнер хочет быть фантазией, он хочет показать другое изображение, основанное на количестве предметов в корзине. Например, если есть, покажите cartTab-1.png, если 2, покажите cartTab-2.png ...Как программно изменить изображение tabbarItem

Я попытался изменить изображение tabaritem (UITabBarItem), но это не сработало для меня , Возможно ли это? Я обсуждал с моим коллегой, он сказал, что мне, возможно, придется нарисовать изображение поверх вкладки. Есть ли у вас предложения? Благодарности

подробнее:

  1. Я создал TabItem с помощью InterfaceBuilder и установите изображение и название там
  2. мне нужно поддержать iOS4. Поэтому я не могу использовать setSelectedImage ...
  3. В моем случае это KVO, если счетчик корзины изменяется, он уведомляет метод обновления изображения. а не на этапе инициализации.

Кто-нибудь знает, почему [self.tabBarItem setImage:[UIImage imageNamed:@"cartxxx.png"]] не работает? Когда я отладки, свойство действительно изменилось, но интерфейс остается таким же

Update

ниже код работает. Всем спасибо!

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, если счетчик корзины изменяется, он уведомляет метод обновления изображения. не на этапе инициализации –

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"]; BTW, я сделал это в viewDidLoad. –

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, если счетчик корзины изменяется, он уведомляет метод обновления изображения. –

+0

это метод iOS5. Если вам нужно поддерживать iOS4, вам придется подклассифицировать UITabBar и создать собственный код изображения ... его раздражает и очень долго и может стать очень ошибкой. Есть учебные пособия о том, как добавить пользовательский образ в UITabBar – ColdLogic

3

Самый простой способ я нашел вариант

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

'self.tabBarItem' не обязательно не нуль. – Raptor

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

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

Как уже упоминалось на обновленный вопрос и другое swards, в большинстве случаев необходимо получить доступ к UITabBarItem через UITabBarController.

Похоже, что IOS создает копию экземпляра UITabBarItem, что объясняет, почему обновление self.tabBarItem свойство не отражает изменения в пользовательском интерфейсе:

Two UITabBarItem instances

Моя догадка, что это происходит, когда Элементы панели вкладок создаются программно, а не раскадрой, но это всего лишь предположение.

Решение, как указано, обращается к массиву элементов панели вкладок через контроллер панели вкладок. Это решение плохо в том, что это зависит от знаний индекса элемента панели вкладок:

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

Не забудьте обновить оба изображения по умолчанию и отдельных государств.

Смежные вопросы