Zmiana odcienia / koloru tła paska UITabBar

87

Zarówno UINavigationBar, jak i UISearchBar mają właściwość tintColor, która umożliwia zmianę koloru odcienia (co jest zaskakujące, wiem) obu tych elementów. Chcę zrobić to samo z UITabBar w mojej aplikacji, ale teraz znalazłem sposób, aby zmienić go z domyślnego czarnego koloru. Jakieś pomysły?

piksel
źródło
To są świetne odpowiedzi. Jeśli zezwalasz na autorotację, pomocne jest ustawienie maski autorezowania widoku podrzędnego tak, aby miała elastyczne marginesy i rozmiar, w przeciwnym razie nowe tło nie zmieni rozmiaru za pomocą paska kart.
pmdj

Odpowiedzi:

47

Udało mi się to zrobić, tworząc podklasy UITabBarController i używając klas prywatnych:

@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
źródło
1
Jest to trochę dziwne rozwiązanie, ponieważ po prostu umieszcza półprzezroczysty brązowy prostokąt na górze paska kart. Problem polega na tym, że wszystkie przyciski są brązowe, a nie tylko tło. Jednak wydaje się, że jest to najlepsza opcja, jaką kiedykolwiek przedstawiono.
Jonah
czy to jest prywatny interfejs API? czy jeśli użyję tego w mojej aplikacji, otrzymam odmowę?
Frank
wydaje się, że nie ma tam żadnych prywatnych połączeń nie
Anthony Main
właściwość tabbar była niedostępna.
coneybeare
to modyfikuje tło paska kart, a nie podświetlenie „wybranego elementu”, którym byłbym bardziej zainteresowany
smdvlpr
105

iOS 5 dodał kilka nowych metod wyglądu, aby dostosować wygląd większości elementów interfejsu użytkownika.

Możesz kierować reklamy na każde wystąpienie UITabBar w aplikacji przy użyciu serwera proxy wyglądu.

W przypadku iOS 5 + 6:

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

W przypadku iOS 7 i nowszych użyj następujących opcji:

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

Użycie proxy wyglądu spowoduje zmianę dowolnego wystąpienia paska kart w całej aplikacji. W konkretnym przypadku użyj jednej z nowych właściwości tej klasy:

UIColor *tintColor; // iOS 5+6
UIColor *barTintColor; // iOS 7+
UIColor *selectedImageTintColor;
UIImage *backgroundImage;
UIImage *selectionIndicatorImage;
imnk
źródło
3
Nie. Jak już wspomniałem, są one przeznaczone dla systemu iOS 5. Zawsze możesz kierować reklamy na określone wersje za pomocą instrukcji kompilacji warunkowej: cocoawithlove.com/2010/07/ ...
imnk
Dzięki, to było pomocne :) Nigdy nie wiedziałem, że coś takiego istnieje.
Veeru
W przypadku iOS 7 użyj opcji [Wygląd UITabBar] setBarTintColor, jeśli chcesz zmienić kolor tła
Zeezer
34

Mam dodatek do ostatecznej odpowiedzi. Chociaż podstawowy schemat jest poprawny, sztuczka polegająca na użyciu częściowo przezroczystego koloru może zostać ulepszona. Zakładam, że to tylko po to, aby pokazać domyślny gradient. Och, także wysokość TabBar wynosi 49 pikseli zamiast 48, przynajmniej w systemie OS 3.

Tak więc, jeśli masz odpowiedni obraz 1 x 49 z gradientem, to jest wersja viewDidLoad, której powinieneś użyć:

- (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
źródło
1
jeśli chcesz, aby było ładnie z obrazem w tle, zobacz: duivesteyn.net/2010/01/16/iphone-custom-tabbar-background-image
oberbaum
1
Myślę, że musi to być: [[self tabBar] insertSubview: v atIndex: 0];
Vibhor Goyal
Wiem, że odpowiedź jest stara, ale to zadziałało. Ponieważ potrzebowałem niestandardowego obrazu zamiast koloru, zmieszałem twoją odpowiedź z tym jednym odcieniem na paskach - część
UITabBar
27

Kiedy użyjesz tylko addSubview, twoje przyciski stracą klikalność, więc zamiast

[[self tabBar] addSubview:v];

posługiwać się:

[[self tabBar] insertSubview:v atIndex:0];
Marcin Zbijowski
źródło
7

Nie ma prostego sposobu, aby to zrobić, po prostu musisz podklasować UITabBar i zaimplementować niestandardowy rysunek, aby zrobić to, co chcesz. To sporo pracy na efekt, ale może warto. Zalecam zgłoszenie błędu w Apple, aby dodać go do przyszłego zestawu SDK iPhone'a.

Louis Gerbarg
źródło
4
Sir, czy wypełniłeś błąd jabłkiem?
Sagar R. Kothari
7

Oto idealne rozwiązanie tego problemu. Działa to dobrze ze mną na iOS5 i 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
źródło
co to jest tabBarcontroller to kontroler, który jest zgodny z UITabarDelegate Czy u wyjaśnić plz?
iCoder
7

W systemie iOS 7:

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

Polecam również ustawienie najpierw w zależności od twoich wizualnych pragnień:

[[UITabBar appearance] setBarStyle:UIBarStyleBlack];

Styl paska zapewnia subtelny separator między zawartością widoku a paskiem kart.

capikaw
źródło
5

[[self tabBar] insertSubview:v atIndex:0]; u mnie działa idealnie.

Jimmy
źródło
5

dla mnie bardzo łatwo jest zmienić kolor Tabbar, na przykład: -

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


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

Spróbuj tego!!!

Muhammad Rizwan
źródło
Pracować w porządku! +1 dla u.
Wentylator YSR
3
 [[UITabBar appearance] setTintColor:[UIColor redColor]];
 [[UITabBar appearance] setBarTintColor:[UIColor yellowColor]];
Hsm
źródło
2

tylko dla koloru tła

Tabbarcontroller.tabBar.barTintColor=[UIColor redcolour];

lub to w delegacie aplikacji

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

do zmiany koloru odznaczenia ikon na pasku kart

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

Powyżej iOS 10:

// this need to be in appdelegate didFinishLaunchingWithOptions
[[UITabBar appearance] setUnselectedItemTintColor:[UIColor blackColor]];
Vaibhav Gaikwad
źródło
1

W istniejących odpowiedziach jest kilka dobrych pomysłów, wiele z nich działa nieco inaczej, a wybór zależy również od tego, na które urządzenia celujesz i jaki wygląd chcesz osiągnąć. UITabBarjest notorycznie nieintuicyjny, jeśli chodzi o dostosowywanie wyglądu, ale oto kilka innych sztuczek, które mogą pomóc:

1). Jeśli chcesz pozbyć się błyszczącej nakładki, aby uzyskać bardziej płaski wygląd, wykonaj:

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

2). Aby ustawić niestandardowe obrazy na przyciskach tabBar, wykonaj coś takiego:

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

Gdzie selectedi unselectedUIImagewybrane przez Ciebie obiekty. Jeśli chcesz, aby miały jednolity kolor, najprostszym rozwiązaniem, które znalazłem, jest utworzenie UIViewżądanego, backgroundColora następnie renderowanie go na a UIImageza pomocą QuartzCore. Używam następującej metody w kategorii, UIViewaby uzyskać UIImagez zawartością widoku:

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

3) Na koniec możesz dostosować stylizację tytułów przycisków. Zrobić:

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

Pozwala to na wprowadzenie pewnych korekt, ale nadal jest dość ograniczone. W szczególności nie możesz dowolnie modyfikować miejsca umieszczenia tekstu w przycisku i nie możesz mieć różnych kolorów dla wybranych / niezaznaczonych przycisków. Jeśli chcesz uzyskać bardziej szczegółowy układ tekstu, po prostu ustaw UITextAttributeTextColorgo na wyraźny i dodaj tekst do obrazów selectedi unselectedz części (2).

Słone Orzechy
źródło
1
[v setBackgroundColor ColorwithRed: Green: Blue: ];
MaxEcho
źródło
0

Innym rozwiązaniem (które jest hackem) jest ustawienie alfa na tabBarController na 0,01, tak aby była praktycznie niewidoczna, ale nadal klikalna. Następnie ustaw kontrolkę ImageView na dole końcówki MainWindow z niestandardowym obrazem paska kart pod oznaczonym alfabetem tabBarCOntroller. Następnie zamień obrazy, zmień kolory lub podświetlić, gdy kontroler tabulatorów przełącza widoki.

Jednak tracisz „... więcej” i dostosowujesz funkcjonalność.

user855723
źródło
0

Cześć. Używam zestawu SDK 4 systemu iOS i udało mi się rozwiązać ten problem za pomocą zaledwie dwóch wierszy kodu i wygląda to tak

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

Mam nadzieję że to pomoże!

Jorge Vicente Mendoza
źródło
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
źródło
0

Odpowiedź Swift 3.0: (z Vaibhav Gaikwad)

Aby zmienić kolor odznaczenia ikon na pasku kart:

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

Tylko do zmiany koloru tekstu:

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

UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.red, for: .selected)
odemolliens
źródło
0

Swift 3 używając wyglądu z twojego AppDelegatewykonaj następujące czynności:

UITabBar.appearance().barTintColor = your_color

Bobj-C
źródło