Изменение оттенка / цвета фона UITabBar


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

18 85

18 ответов:

я смог заставить его работать, подкласс 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

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

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

для iOS 5 + 6:

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

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

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

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

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

У меня есть дополнение к окончательному ответу. Хотя основная схема верна,трюк с использованием частично прозрачного цвета может быть улучшен. Я предполагаю, что это только для того, чтобы показать градиент по умолчанию. О, кроме того, высота панели вкладок составляет 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];

}

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

[[self tabBar] addSubview:v];

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

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

следующим является идеальным решением для этого. Это прекрасно работает со мной для 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];
}

на iOS 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];

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

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

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

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

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


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

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

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

только для цвета фона

Tabbarcontroller.tabBar.barTintColor=[UIColor redcolour];

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

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

для изменения цвета снять выделение значков на вкладках

для iOS 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]];

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

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

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

2). Установка пользовательских изображений на панель вкладок кнопки делают что-то вроде:

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

здесь selected и unselected are 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) Наконец, вы можете настроить стиль названия кнопок. Делать:

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

[v setBackgroundColor ColorwithRed: Green: Blue: ];

другое решение (которое является взломом) состоит в том, чтобы установить Альфа на tabBarController в 0.01 так, чтобы он был практически невидимым, но все же кликабельным. Затем установите элемент управления ImageView в нижней части пера MainWindow с пользовательским изображением панели вкладок под alpha'Ed tabBarCOntroller. Затем замените изображения, измените цвета или высокий свет, когда tabbarcontroller переключает виды.

однако, вы теряете '...еще и настроить функционал.

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

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

надеюсь, что это помогает!

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];
}

Swift 3.0 ответ: (из Вэбов Gaikwad)

для изменения цвета невыбранных иконок таббара:

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)

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

UITabBar.appearance().barTintColor = your_color