Cambio de tinte / color de fondo de UITabBar

87

UINavigationBar y UISearchBar tienen una propiedad tintColor que le permite cambiar el color del tinte (sorprendente, lo sé) de ambos elementos. Quiero hacer lo mismo con UITabBar en mi aplicación, pero ahora he encontrado la manera de cambiarlo del color negro predeterminado. ¿Algunas ideas?

pixel
fuente
Estas son grandes respuestas. Si permite la autorrotación, es útil configurar la máscara de tamaño automático de la subvista para que tenga márgenes y tamaño flexibles, o el nuevo fondo no cambiará de tamaño con la barra de pestañas.
pmdj

Respuestas:

47

He podido hacer que funcione subclasificando un UITabBarController y usando clases privadas:

@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
coneybeare
fuente
1
Esta es una solución extraña, ya que simplemente coloca un rectángulo marrón semitransparente en la parte superior de la barra de pestañas. El problema es que todos los botones se vuelven marrones, no solo el fondo. Sin embargo, esta parece ser la mejor opción que se ha presentado hasta ahora.
Jonás
¿Es esta una API privada? Si utilizo esto en mi aplicación, ¿me rechazarían?
Frank
no parece haber ninguna llamada privada allí no
Anthony Main
la propiedad de la barra de pestañas solía no ser accesible.
coneybeare
esto modifica el fondo de la barra de pestañas, no el resaltado del "elemento seleccionado", que me interesaría más
smdvlpr
105

iOS 5 ha agregado algunos métodos de apariencia nuevos para personalizar el aspecto de la mayoría de los elementos de la interfaz de usuario.

Puede orientar cada instancia de una UITabBar en su aplicación utilizando el proxy de apariencia.

Para iOS 5 + 6:

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

Para iOS 7 y superior, utilice lo siguiente:

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

El uso del proxy de apariencia cambiará cualquier instancia de la barra de pestañas en toda la aplicación. Para una instancia específica, use una de las nuevas propiedades en esa clase:

UIColor *tintColor; // iOS 5+6
UIColor *barTintColor; // iOS 7+
UIColor *selectedImageTintColor;
UIImage *backgroundImage;
UIImage *selectionIndicatorImage;
imnk
fuente
3
No Como señalé, son para iOS 5. Siempre puede apuntar a versiones específicas con declaraciones de compilación condicionales: cocoawithlove.com/2010/07/…
imnk
Gracias, eso fue útil :) Nunca supe que existía tal cosa.
Veeru
Para iOS 7, use [apariencia de UITabBar] setBarTintColor, si desea cambiar el color de fondo
Zeezer
34

Tengo un apéndice a la respuesta final. Si bien el esquema esencial es correcto, se puede mejorar el truco de usar un color parcialmente transparente. Supongo que es solo para dejar que se vea el degradado predeterminado. Ah, también, la altura de TabBar es de 49 píxeles en lugar de 48, al menos en OS 3.

Entonces, si tiene una imagen apropiada de 1 x 49 con un degradado, esta es la versión de viewDidLoad que debe usar:

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

}
pabugeater
fuente
1
si quieres que sea bonito con una imagen de fondo, mira esto: duivesteyn.net/2010/01/16/iphone-custom-tabbar-background-image
oberbaum
1
Creo que debe ser: [[self tabBar] insertSubview: v atIndex: 0];
Vibhor Goyal
Sé que la respuesta es antigua, pero me funcionó. Como necesitaba una imagen personalizada en lugar de un color, mezclé su respuesta con este tinte en las barras - UITabBar part
RaphaelDDL
27

Cuando solo usa addSubview, sus botones perderán la capacidad de hacer clic, por lo que en lugar de

[[self tabBar] addSubview:v];

utilizar:

[[self tabBar] insertSubview:v atIndex:0];
Marcin Zbijowski
fuente
7

No hay una forma sencilla de hacer esto, básicamente necesitas crear una subclase de UITabBar e implementar un dibujo personalizado para hacer lo que quieras. Es bastante trabajo para el efecto, pero puede valer la pena. Recomiendo presentar un error a Apple para agregarlo a un futuro iPhone SDK.

Louis Gerbarg
fuente
4
Señor, ¿llenó un error con manzana?
Sagar R. Kothari
7

La siguiente es la solución perfecta para esto. Esto funciona bien conmigo para iOS5 e 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];
}
Gaurav
fuente
¿Qué es tabBarcontroller? ¿Es el controlador que cumple con UITabarDelegate? ¿Puede explicarlo por favor?
The iCoder
7

En iOS 7:

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

También recomiendo configurar primero en función de sus deseos visuales:

[[UITabBar appearance] setBarStyle:UIBarStyleBlack];

El estilo de barra coloca un sutil separador entre el contenido de la vista y la barra de pestañas.

capikaw
fuente
5

[[self tabBar] insertSubview:v atIndex:0]; funciona perfectamente para mí.

palanqueta
fuente
5

para mí es muy simple cambiar el color de Tabbar como: -

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


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

¡¡¡Prueba esto!!!

Muhammad Rizwan
fuente
¡Funcionando bien! +1 para u.
Fan de YSR
3
 [[UITabBar appearance] setTintColor:[UIColor redColor]];
 [[UITabBar appearance] setBarTintColor:[UIColor yellowColor]];
Hsm
fuente
2

solo por color de fondo

Tabbarcontroller.tabBar.barTintColor=[UIColor redcolour];

o esto en App Delegate

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

para cambiar el color de los iconos deseleccionados de la barra de pestañas

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

Por encima de iOS 10:

// this need to be in appdelegate didFinishLaunchingWithOptions
[[UITabBar appearance] setUnselectedItemTintColor:[UIColor blackColor]];
Vaibhav Gaikwad
fuente
1

Hay algunas buenas ideas en las respuestas existentes, muchas funcionan de manera ligeramente diferente y lo que elija también dependerá de los dispositivos a los que se dirija y del tipo de aspecto que desee lograr. UITabBares notoriamente poco intuitivo cuando se trata de personalizar su apariencia, pero aquí hay algunos trucos más que pueden ayudar:

1). Si está buscando deshacerse de la superposición brillante para una apariencia más plana, haga:

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

2). Para configurar imágenes personalizadas en los botones de tabBar, haga algo como:

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

Donde selectedy unselectedson UIImageobjetos de tu elección. Si desea que sean de un color plano, la solución más simple que encontré es crear un UIViewcon el deseado backgroundColory luego convertirlo en un UIImagecon la ayuda de QuartzCore. Utilizo el siguiente método en una categoría UIViewpara obtener un UIImagecontenido de la vista:

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

3) Por último, es posible que desee personalizar el estilo de los títulos de los botones. Hacer:

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

Esto le permite hacer algunos ajustes, pero aún bastante limitados. En particular, no puede modificar libremente dónde se coloca el texto dentro del botón y no puede tener diferentes colores para los botones seleccionados / no seleccionados. Si desea hacer un diseño de texto más específico, simplemente configúrelo UITextAttributeTextColorpara que sea claro y agregue su texto en las imágenes selectedy unselectedde la parte (2).

Nueces saladas
fuente
1
[v setBackgroundColor ColorwithRed: Green: Blue: ];
MaxEcho
fuente
0

Otra solución (que es un truco) es establecer el alfa en el tabBarController en 0.01 para que sea virtualmente invisible pero aún se pueda hacer clic. Luego, establezca un control ImageView en la parte inferior de la plumilla de MainWindow con su imagen de barra de pestañas personalizada debajo de tabBarCOntroller alfa'ed. Luego intercambie las imágenes, cambie los colores o resalte cuando el controlador de la barra de pestañas cambie de vista.

Sin embargo, pierde la funcionalidad '... más' y personalización.

usuario855723
fuente
0

Hola, estoy usando iOS SDK 4 y pude resolver este problema con solo dos líneas de código y es así

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

¡Espero que esto ayude!

Jorge Vicente Mendoza
fuente
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];
}
usuario1049755
fuente
0

Respuesta rápida 3.0: (de Vaibhav Gaikwad)

Para cambiar el color de los iconos deseleccionados de la barra de pestañas:

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

Solo para cambiar el color del texto:

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

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

Swift 3 usando la apariencia de tu AppDelegatehaz lo siguiente:

UITabBar.appearance().barTintColor = your_color

Bobj-C
fuente