Mudança de tonalidade / cor de fundo de UITabBar

87

O UINavigationBar e o UISearchBar têm uma propriedade tintColor que permite alterar a cor da tonalidade (surpreendente, eu sei) de ambos os itens. Quero fazer a mesma coisa com o UITabBar em meu aplicativo, mas descobri agora uma maneira de alterá-lo da cor preta padrão. Alguma ideia?

pixel
fonte
Essas são ótimas respostas. Se você estiver permitindo a rotação automática, é útil definir a máscara de redimensionamento automático da subvisualização para ter margens e tamanho flexíveis, ou o novo plano de fundo não será redimensionado com a barra de guias.
pmdj

Respostas:

47

Consegui fazer isso funcionar criando uma subclasse de um UITabBarController e usando classes 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
fonte
1
Esta é uma solução meio estranha, pois apenas coloca um retângulo marrom semitransparente no topo da barra de guias. O problema é que todos os botões ficaram marrons, não apenas o fundo. No entanto, esta parece ser a melhor opção que alguém apresentou até agora.
Jonah
esta é uma API privada? se eu usasse isso no meu aplicativo, seria recusado?
Frank
não parece haver nenhuma chamada privada lá não
Anthony Main
a propriedade tabbar costumava não ser acessível.
coneybeare
isso modifica o fundo da barra de guias, não o destaque do "item selecionado", no qual eu estaria mais interessado
smdvlpr
105

O iOS 5 adicionou alguns novos métodos de aparência para personalizar a aparência da maioria dos elementos da IU.

Você pode direcionar cada instância de um UITabBar em seu aplicativo usando o proxy de aparência.

Para iOS 5 + 6:

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

Para iOS 7 e superior, use o seguinte:

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

Usar o proxy de aparência mudará qualquer instância da barra de guias em todo o aplicativo. Para uma instância específica, use uma das novas propriedades dessa classe:

UIColor *tintColor; // iOS 5+6
UIColor *barTintColor; // iOS 7+
UIColor *selectedImageTintColor;
UIImage *backgroundImage;
UIImage *selectionIndicatorImage;
imnk
fonte
3
Não. Como mencionei
imnk
Obrigado, isso foi útil :) Nunca soube que existia tal coisa.
Veeru
Para iOS 7, use [aparência UITabBar] setBarTintColor, se você quiser alterar a cor de fundo
Zeezer
34

Eu tenho um adendo para a resposta final. Embora o esquema essencial esteja correto, o truque de usar uma cor parcialmente transparente pode ser melhorado. Presumo que seja apenas para deixar o gradiente padrão aparecer. Ah, também, a altura do TabBar é de 49 pixels em vez de 48, pelo menos no OS 3.

Portanto, se você tiver uma imagem adequada de 1 x 49 com gradiente, esta é a versão de viewDidLoad que você deve 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
fonte
1
se você quiser torná-lo bonito com uma imagem de fundo, veja isto: duivesteyn.net/2010/01/16/iphone-custom-tabbar-background-image
oberbaum
1
Acho que precisa ser: [[self tabBar] insertSubview: v atIndex: 0];
Vibhor Goyal
Eu sei que a resposta é antiga, mas funcionou para mim. Como eu precisava de uma imagem personalizada em vez de uma cor, misturei sua resposta com este tom nas barras - parte UITabBar
RaphaelDDL
27

Quando você apenas usa addSubview, seus botões perdem a capacidade de clicar, então, em vez de

[[self tabBar] addSubview:v];

usar:

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

Não há uma maneira simples de fazer isso. Basicamente, você precisa criar uma subclasse de UITabBar e implementar o desenho personalizado para fazer o que quiser. É um pouco trabalhoso para o efeito, mas pode valer a pena. Recomendo registrar um bug com a Apple para adicioná-lo a um futuro iPhone SDK.

Louis Gerbarg
fonte
4
Senhor, você encheu um bug com maçã?
Sagar R. Kothari
7

A seguir está a solução perfeita para isso. Isso funciona bem comigo 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
fonte
o que é tabBarcontroller é o controlador que está em conformidade com UITabarDelegate Você pode explicar por favor?
The iCoder
7

No iOS 7:

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

Também recomendo definir primeiro de acordo com seus desejos visuais:

[[UITabBar appearance] setBarStyle:UIBarStyleBlack];

O estilo de barra coloca um separador sutil entre seu conteúdo de visualização e sua barra de guias.

Capikaw
fonte
5

[[self tabBar] insertSubview:v atIndex:0]; funciona perfeitamente para mim.

Jimmy
fonte
5

para mim, é muito simples mudar a cor do 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"];

Experimente isso !!!

Muhammad Rizwan
fonte
Trabalhando bem! 1 para você.
YSR fã de
3
 [[UITabBar appearance] setTintColor:[UIColor redColor]];
 [[UITabBar appearance] setBarTintColor:[UIColor yellowColor]];
Hsm
fonte
2

apenas para cor de fundo

Tabbarcontroller.tabBar.barTintColor=[UIColor redcolour];

ou isso em App Delegate

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

para mudar a cor dos ícones não selecionados da barra de guias

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

Acima do iOS 10:

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

Existem algumas boas ideias nas respostas existentes, muitas funcionam de maneira um pouco diferente e o que você escolhe também dependerá de quais dispositivos você visa e que tipo de aparência você pretende alcançar. UITabBaré notoriamente pouco intuitivo quando se trata de personalizar sua aparência, mas aqui estão mais alguns truques que podem ajudar:

1). Se você deseja se livrar da sobreposição brilhante para uma aparência mais plana, faça:

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

2). Para definir imagens personalizadas para os botões da barra de guias, faça algo como:

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

Onde selectede unselectedsão UIImageobjetos de sua escolha. Se você quiser que eles tenham uma cor lisa, a solução mais simples que encontrei é criar um UIViewcom o desejado backgroundColore então apenas renderizá-lo em um UIImagecom a ajuda do QuartzCore. Eu uso o seguinte método em uma categoria UIViewpara obter um UIImagecom o conteúdo da visualização:

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

3) Finalmente, você pode querer personalizar o estilo dos títulos dos botões. Faz:

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

Isso permite que você faça alguns ajustes, mas ainda bastante limitados. Particularmente, você não pode modificar livremente onde o texto é colocado dentro do botão e não pode ter cores diferentes para botões selecionados / não selecionados. Se você quiser fazer um layout de texto mais específico, basta definir UITextAttributeTextColorpara ser claro e adicionar seu texto nas imagens selectede unselectedda parte (2).

SaltyNuts
fonte
1
[v setBackgroundColor ColorwithRed: Green: Blue: ];
MaxEcho
fonte
0

Outra solução (que é um hack) é definir o alfa no tabBarController como 0,01 para que seja virtualmente invisível, mas ainda clicável. Em seguida, defina um controle ImageView na parte inferior da ponta da MainWindow com sua imagem da barra de guias personalizada abaixo do tabBarCOntroller com alfa. Em seguida, troque as imagens, mude as cores ou a luz de destaque quando o controlador da barra de guias alternar as visualizações.

No entanto, você perde a funcionalidade '... mais' e personaliza.

user855723
fonte
0

Olá, estou usando o iOS SDK 4 e consegui resolver esse problema com apenas duas linhas de código e funciona assim

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

Espero que isto ajude!

Jorge Vicente Mendoza
fonte
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];
}
user1049755
fonte
0

Resposta do Swift 3.0: (de Vaibhav Gaikwad)

Para alterar a cor dos ícones não selecionados da barra de guias:

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

Para alterar apenas a cor do texto:

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

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

Swift 3 usando a aparência do seu AppDelegatefaça o seguinte:

UITabBar.appearance().barTintColor = your_color

Bobj-C
fonte