2013-12-05 2 views
6

Можно ли изменить цвет фона конкретного UITabBarItem в UITabBar?uitabbar изменить цвет фона одного uitabbaritem на iOS7

Я знаю, как изменить весь фон выбранного фона, используя:

[[UITabBar appearance] setBarTintColor:[UIColor redColor]]; 
[[UITabBar appearance] setTintColor:[UIColor blueColor]]; 
[[UITabBar appearance] setSelectedImageTintColor:[UIColor yellowColor]]; 

Но это может быть сделано только один пункт без подклассов?

Спасибо

ответ

29

Вы можете добавить subview к родительскому tabBar и установить цвет фона в подвью. Вы можете использовать размеры рамки tabBar для вычисления смещения и ширины вашего tabBarItem, а затем вставить подвью под ним.

Пример (в Swift):

// Add background color to middle tabBarItem 
let itemIndex = 2 
let bgColor = UIColor(red: 0.08, green: 0.726, blue: 0.702, alpha: 1.0) 

let itemWidth = tabBar.frame.width/CGFloat(tabBar.items!.count) 
let bgView = UIView(frame: CGRectMake(itemWidth * itemIndex, 0, itemWidth, tabBar.frame.height)) 
bgView.backgroundColor = bgColor 
tabBar.insertSubview(bgView, atIndex: 0) 
+0

Спасибо @ nathan.f77, это работает, единственная проблема заключается в том, что я могу только изменить цвет фона (я принял ваш ответ, потому что это был мой вопрос). Но когда я меняю цвет фона, мне также нужно изменить оттенок этого элемента. Теперь я добавляю кнопку сверху на tarBar в позиции позиции ... :( –

+0

Когда я копирую и вставляю этот код, xCode дает ошибку: «Не удалось найти член-рамку» на линии: let bgView = ... –

+0

@ChrisHarrison - это странно, потому что вы вызываете 'tabBar.frame' в строке выше этого, поэтому он должен давать ошибка там также. – ndbroadbent

0

Вы не можете сделать это с использованием свойства оттенка. См. this post о том, что даже setSelectedImageTintColor действительно не работает (это не последний раз, когда я проверил).

Решение о замене tintColor на лету за рассматриваемый товар. Вы можете сделать это ad hoc всякий раз, когда выбранный элемент изменяется путем реализации метода UITabBarDelegatetabBar:didSelectItem:, например. в делегате приложения.

+0

Эй @Mundi, ТНХ для ваш ответ. Я не хочу менять его, когда он выбирается, но все время. У меня в основном есть пять кнопок с белым фоном, кроме одного в середине, для которого все время есть черный фон. –

+0

@HuguesBR вы нашли способ сделать это? – knl

+0

На самом деле, я не добавил uibutton к представлению панели вкладок, которые маскируют вкладку, о которой идет речь, чтобы сделать трюк ... –

5

в Swift: Это решение для приложений с помощью Auto Layout. Основное различие между другим решением заключается в следующем: tabBar.frame.width не получает фактическую ширину экрана устройства. Таким образом, bgView появляется неправильно.

Вы можете это исправить с этим: UIScreen.mainScreen().bounds.width

let tabWidth:CGFloat = UIScreen.mainScreen().bounds.width/CGFloat(self.tabbar!.items!.count) 
    let tabIndex:CGFloat = 2 
    let bgColor:UIColor = UIColor.redColor() 
    let bgView = UIView(frame: CGRectMake(tabWidth * tabIndex, 0, tabWidth, 49)) 
    bgView.backgroundColor = bgColor 
    self.tabbar!.insertSubview(bgView, atIndex: 0) 

49 is a default height of UITabbar

+0

Не уверен, что это вызвано недавним изменением формата авто или нет, но это не сработает. Вставка нового представления в индекс 0 в последней строке кода будет иметь другие подзаголовки (скорее всего, фоновый вид), которые перезаписывают наше новое представление. Как и во всех определениях представлений, последовательность подсмотров имеет значение для рендеринга. Чтобы поместить новый вид над фоном, но под изображением и текстом элемента tabIndex, это, похоже, исправить вещи с помощью iOS 9/Xcode 7.3: self.tabBar! .InsertSubview (bgView, atIndex: tabIndex + 2) – marco

3

Objective решение C:

int itemIndex = 3; 
UIColor* bgColor = [UIColor colorWithRed:(245/255.f) green:(192/255.f) blue:(47/255.f) alpha:1]; 

float itemWidth = self.tabBarController.tabBar.frame.size.width/5.0f; //5 = tab bar items 
UIView* bgView = [[UIView alloc]initWithFrame: CGRectMake(itemWidth*itemIndex, 0,itemWidth, self.tabBarController.tabBar.frame.size.height)]; 
bgView.backgroundColor = bgColor; 
[self.tabBarController.tabBar insertSubview:bgView atIndex:1]; 
0

Обновление для Swift 4:

let itemIndex:CGFloat = 2.0 
    let bgColor = UIColor.ownBlue 

    let itemWidth = tabBar.frame.width/CGFloat(tabBar.items!.count) 
    let bgView = UIView(frame: CGRect(x: itemWidth * itemIndex, y: 0, width: itemWidth, height: tabBar.frame.height)) 

    bgView.backgroundColor = bgColor 
    tabBar.insertSubview(bgView, at: 0) 
Смежные вопросы