2009-02-20 2 views
84

UINavigationBar и UISearchBar имеют свойство tintColor, которое позволяет вам изменять цвет оттенков (что удивительно, я знаю) обоих этих элементов. Я хочу сделать то же самое с UITabBar в своем приложении, но теперь нашел способ изменить его с черного цвета по умолчанию. Есть идеи?Изменение цвета оттенка/цвета фона UITabBar

+0

Эти большие ответы. Если вы разрешаете авторотирование, полезно установить для параметра autoresizingMask subview гибкие поля и размер, иначе новый фон не будет изменяться с помощью панели вкладок. – pmdj

ответ

48

Я был в состоянии заставить его работать на подклассы в UITabBarController и с использованием частных классов:

@interface UITabBarController (private) 
- (UITabBar *)tabBar; 
@end 

@implementation CustomUITabBarController 


- (void)viewDidLoad { 
    [super viewDidLoad]; 

    CGRect frame = CGRectMake(0.0, 0.0, self.view.bounds.size.width, 48); 
    UIView *v = [[UIView alloc] initWithFrame:frame]; 
    [v setBackgroundColor:kMainColor]; 
    [v setAlpha:0.5]; 
    [[self tabBar] addSubview:v]; 
    [v release]; 

} 
@end 
+1

Это своего рода странное решение, в котором он просто помещает полупрозрачный коричневый прямоугольник поверх вкладки. Проблема в том, что все кнопки становятся коричневыми, а не только фоном. Однако это, по-видимому, лучший вариант, представленный до сих пор. – Jonah

+0

это частный API? если бы я использовал это в своем приложении, мне бы отказали? – Frank

+0

там, как представляется, никаких частных звонков нет –

6

Нет простого способа сделать это, вам в основном нужно подклассы UITabBar и реализовать пользовательский чертеж, чтобы делать то, что вы хотите. Эффект довольно много, но он может стоить того. Я рекомендую подавать ошибку с Apple, чтобы добавить ее в будущий iPhone SDK.

+4

Сэр, вы заполнили ошибку с яблоком? –

1
[v setBackgroundColor ColorwithRed: Green: Blue: ]; 
27

Когда вы просто использовать addSubview ваши кнопки потеряет кликабельность, поэтому вместо

[[self tabBar] addSubview:v]; 

использование:

[[self tabBar] insertSubview:v atIndex:0]; 
+1

спасибо, что это сработало для меня .. – Biranchi

34

У меня есть дополнение к окончательному ответу. Хотя правильная схема правильная, трюк использования частично прозрачного цвета может быть улучшен. Я предполагаю, что это только для того, чтобы позволить градиенту по умолчанию показывать. О, также, высота TabBar составляет 49 пикселей, а не 48, по крайней мере, в OS 3.

Итак, если у вас есть подходящее изображение 1 x 49 с градиентом, это версия viewDidLoad, которую вы должны использовать :

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    CGRect frame = CGRectMake(0, 0, 480, 49); 
    UIView *v = [[UIView alloc] initWithFrame:frame]; 
    UIImage *i = [UIImage imageNamed:@"GO-21-TabBarColorx49.png"]; 
    UIColor *c = [[UIColor alloc] initWithPatternImage:i]; 
    v.backgroundColor = c; 
    [c release]; 
    [[self tabBar] addSubview:v]; 
    [v release]; 

} 
+1

, если вы хотите сделать это довольно с фоновой картиной, см. это : http://duivesteyn.net/2010/01/16/iphone-custom-tabbar-background-image/ – oberbaum

+1

Я думаю, что это должно быть: [[self tabBar] insertSubview: v atIndex: 0]; –

+0

Я знаю, что ответ старый, но это сработало для меня. Так как мне нужен пользовательский образ вместо цвета, я смешал ваш ответ с этим [оттенок на барах - часть UITabBar] (http://letstalkcocoa.com/2009/12/applying-tint-to-bars/) – RaphaelDDL

5

[[self tabBar] insertSubview:v atIndex:0]; отлично работает для меня.

0

Другим решением (которое является взломом) является установка альфы на tabBarController до 0,01, так что она практически невидима, но все еще доступна для кликов. Затем установите элемент управления ImageView внизу нижней части MainWindow с вашим пользовательским изображением на вкладке под альфа-tabBarCOntroller. Затем обменивайтесь изображениями, меняйте цвета или загорать, когда панель управления табло переключает представления.

Однако вы теряете «... больше» и настраиваете функциональность.

103

В iOS 5 добавлены некоторые новые методы внешнего вида для настройки внешнего вида большинства элементов пользовательского интерфейса.

Вы можете настроить таргетинг на каждый экземпляр UITabBar в своем приложении с помощью прокси-сервера внешнего вида.

Для прошивки 5 + 6:

[[UITabBar appearance] setTintColor:[UIColor redColor]]; 

Для прошивки 7 и выше, пожалуйста, используйте следующее:

[[UITabBar appearance] setBarTintColor:[UIColor redColor]]; 

Используя внешний вид прокси изменят любой экземпляр панели вкладок по всему приложению.Для конкретного экземпляра, используйте один из новых свойств на этом классе:

UIColor *tintColor; // iOS 5+6 
UIColor *barTintColor; // iOS 7+ 
UIColor *selectedImageTintColor; 
UIImage *backgroundImage; 
UIImage *selectionIndicatorImage; 
+0

, но будут ли эти коды работать на устройствах iOS 4? – Raptor

+3

Nope. Как я уже сказал, они предназначены для iOS 5. Вы всегда можете настроить таргетинг на определенные версии с помощью операторов условной компиляции: http: // cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html – imnk

+0

Спасибо, это было полезно :) Никогда не знал, что есть такая вещь. – Veeru

0

Привет я использую IOS SDK 4 и я был в состоянии решить эту проблему с помощью всего две строки кода, и это идет как этот

tBar.backgroundColor = [UIColor clearColor]; 
tBar.backgroundImage = [UIImage imageNamed:@"your-png-image.png"]; 

Надеюсь, это поможет!

7

Следующее является идеальным решением для этого. Это отлично работает со мной для iOS5 и iOS4.

//---- For providing background image to tabbar 
UITabBar *tabBar = [tabBarController tabBar]; 

if ([tabBar respondsToSelector:@selector(setBackgroundImage:)]) { 
    // ios 5 code here 
    [tabBar setBackgroundImage:[UIImage imageNamed:@"image.png"]]; 
} 
else { 
    // ios 4 code here 
    CGRect frame = CGRectMake(0, 0, 480, 49); 
    UIView *tabbg_view = [[UIView alloc] initWithFrame:frame]; 
    UIImage *tabbag_image = [UIImage imageNamed:@"image.png"]; 
    UIColor *tabbg_color = [[UIColor alloc] initWithPatternImage:tabbag_image]; 
    tabbg_view.backgroundColor = tabbg_color; 
    [tabBar insertSubview:tabbg_view atIndex:0]; 
} 
+0

Что такое tabBarcontroller - это контроллер, который соответствует UITabarDelegate. Может ли объяснить plz? –

+0

это помогло чуваку приятной работы Спасибо большое :) –

1

Есть некоторые хорошие идеи в существующих ответов, многие из них работают несколько иначе, и то, что вы выбираете, будет также зависеть от того, какие устройства вы предназначаться и какой вид взгляда вы стремитесь достичь. UITabBar, как известно, неинтуитивно, когда дело доходит до настройки его внешнего вида, но вот еще несколько трюков, которые могут помочь:

1). Если вы хотите избавиться от глянцевого наложения для более плоского внешнего вида, выполните следующие действия:

tabBar.backgroundColor = [UIColor darkGrayColor]; // this will be your background 
[tabBar.subviews[0] removeFromSuperview]; // this gets rid of gloss 

2). Чтобы установить пользовательские изображения кнопок TabBar сделать что-то вроде:

for (UITabBarItem *item in tabBar.items){ 
    [item setFinishedSelectedImage:selected withFinishedUnselectedImage:unselected]; 
    [item setImageInsets:UIEdgeInsetsMake(6, 0, -6, 0)]; 
} 

Где selected и unselected являются UIImage объектами вашего выбора. Если вы хотите, чтобы они были плоскими, самое простое решение, которое я нашел, - создать UIView с нужным backgroundColor, а затем просто отнести его в UIImage с помощью QuartzCore. Я использую следующий метод в категории на UIView получить UIImage с содержимым вида по:

- (UIImage *)getImage { 
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [[UIScreen mainScreen]scale]); 
    [[self layer] renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return viewImage; 
} 

3) Наконец, вы можете настроить стиль названий кнопок. Do:

for (UITabBarItem *item in tabBar.items){ 
    [item setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: 
       [UIColor redColor], UITextAttributeTextColor, 
       [UIColor whiteColor], UITextAttributeTextShadowColor, 
       [NSValue valueWithUIOffset:UIOffsetMake(0, 1)], UITextAttributeTextShadowOffset, 
       [UIFont boldSystemFontOfSize:18], UITextAttributeFont, 
      nil] forState:UIControlStateNormal]; 
} 

Это позволяет вам выполнять некоторые настройки, но все еще весьма ограничены. В частности, вы не можете свободно изменять, где текст помещается внутри кнопки, и не могут иметь разные цвета для выбранных/невыделенных кнопок. Если вы хотите сделать более конкретный макет текста, просто установите UITextAttributeTextColor, чтобы быть четким, и добавьте текст в изображения selected и unselected из части (2).

5

для меня его очень просто изменить цвет TabBar как: -

[self.TabBarController.tabBar setTintColor:[UIColor colorWithRed:0.1294 green:0.5686 blue:0.8353 alpha:1.0]]; 


[self.TabBarController.tabBar setTintColor:[UIColor "YOUR COLOR"]; 

Попробуйте !!!

+1

Не работает в приложении на основе tabbarcontroller, вы протестировали ??? –

+0

Работаю отлично! +1 для u. –

0
if ([tabBar respondsToSelector:@selector(setBackgroundImage:)]) { 
    // ios 5 code here 
    [tabBar setBackgroundImage:[UIImage imageNamed:@"image.png"]]; 
} 
else { 
    // ios 4 code here 
    CGRect frame = CGRectMake(0, 0, 480, 49); 
    UIView *tabbg_view = [[UIView alloc] initWithFrame:frame]; 
    UIImage *tabbag_image = [UIImage imageNamed:@"image.png"]; 
    UIColor *tabbg_color = [[UIColor alloc] initWithPatternImage:tabbag_image]; 
    tabbg_view.backgroundColor = tabbg_color; 
    [tabBar insertSubview:tabbg_view atIndex:0]; 
} 
7

КСНЫ 7:

[[UITabBar appearance] setBarTintColor:[UIColor colorWithRed:(38.0/255.0) green:(38.0/255.0) blue:(38.0/255.0) alpha:1.0]]; 

Я также рекомендую установить первый в зависимости от ваших визуальных желаний:

[[UITabBar appearance] setBarStyle:UIBarStyleBlack]; 

стиля бара ставит тонкий разделитель между содержанием представления и вкладками бар.

3
[[UITabBar appearance] setTintColor:[UIColor redColor]]; 
[[UITabBar appearance] setBarTintColor:[UIColor yellowColor]]; 
2

только за цвет фона

Tabbarcontroller.tabBar.barTintColor=[UIColor redcolour]; 

или это в App делегатом

[[UITabBar appearance] setBackgroundColor:[UIColor blackColor]]; 

для изменения цвета UNSELECT икон TabBar

Для прошивкой 10:

// this code need to be placed on home page of tabbar  
for(UITabBarItem *item in self.tabBarController.tabBar.items) { 
    item.image = [item.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
} 

Над IOS 10:

// this need to be in appdelegate didFinishLaunchingWithOptions 
[[UITabBar appearance] setUnselectedItemTintColor:[UIColor blackColor]]; 
0

Swift 3,0 Ответ: (от Vaibhav Gaikwad)

Для изменения цвета UNSELECT иконок TabBar:

if #available(iOS 10.0, *) { 
     UITabBar.appearance().unselectedItemTintColor = UIColor.white 
    } else { 
     // Fallback on earlier versions 
     for item in self.tabBar.items! { 
      item.image = item.image?.withRenderingMode(UIImageRenderingMode.alwaysOriginal) 
     } 
} 

Для только изменение цвета текста:

UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.white], for: .normal) 

UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.red, for: .selected) 
0

Swift 3, используя внешний вид из вашего AppDelegate сделать следующее:

UITabBar.appearance().barTintColor = your_color

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