как программно изменить изображение tabbarItem - PullRequest
4 голосов
/ 13 января 2012

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

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

подробнее:

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

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

Обновление

приведенный ниже код работает. Спасибо всем!

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

Ответы [ 8 ]

8 голосов
/ 31 октября 2016

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)
6 голосов
/ 22 июня 2016
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 голосов
/ 16 марта 2014

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

     self.tabBarItem.image=[UIImage imageNamed:@"myImage.png"];
2 голосов
/ 13 января 2012

Попробуйте это:

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 голос
/ 13 января 2012
- (void)setFinishedSelectedImage:(UIImage *)selectedImage withFinishedUnselectedImage:(UIImage *)unselectedImage

selectedImage отображается, когда пользователь выбрал вкладку.unselectedImage отображается, когда пользователь выбрал другую вкладку.

в вашем viewDidLoad: do

UIImage *c1 = [UIImage imageNamed:@"cart1.png"];
UIImage *c2 = [UIImage imageNamed:@"cart1unselected.png"];
[[self tabBarItem] setFinishedSelectedImage:c1 withFinishedUnselectedImage:c2];
1 голос
/ 13 января 2012

Этот ответ может вам помочь

  UITabBarItem *i5=[[UITabBarItem alloc]initWithTitle:@"Profile" image:[UIImage imageNamed:@"profile.png"] tag:5];
0 голосов
/ 28 декабря 2018
let favorites = UITabBarItem(title: nil, image:UIImage(named: "Screen Shot 2018-12-13 at 11.00.42 AM") , tag: 0)
0 голосов
/ 03 мая 2017

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

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

Two UITabBarItem instances

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

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

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

Не забудьте обновить оба изображения для стандартных и выбранных состояний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...