UITabBar'ın Tonunu / Arka Plan rengini Değiştirme


87

UINavigationBar ve UISearchBar öğelerinin her ikisinin de ton rengini (şaşırtıcı, biliyorum) değiştirmenize izin veren bir tintColor özelliği vardır. Aynı şeyi uygulamamdaki UITabBar'a yapmak istiyorum, ancak şimdi onu varsayılan siyah renginden değiştirmenin bir yolunu buldum. Herhangi bir fikir?


Bunlar harika cevaplar. Otomatik döndürmeye izin veriyorsanız, alt görünümün otomatik yeniden boyutlandırma maskesini esnek kenar boşluklarına ve boyuta sahip olacak şekilde ayarlamak yararlıdır, aksi takdirde yeni arka plan sekme çubuğuyla yeniden boyutlandırılmaz.
pmdj

Yanıtlar:


47

Bir UITabBarController'ı alt sınıflandırarak ve özel sınıfları kullanarak çalışmasını sağlayabildim:

@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
Bu biraz tuhaf bir çözüm çünkü tabbarın üstüne yarı saydam kahverengi dikdörtgen yerleştiriyor. Sorun, yalnızca arka planın değil, tüm düğmelerin kahverengiye dönmesidir. Ancak bu şimdiye kadar herkesin sunduğu en iyi seçenek gibi görünüyor.
Jonah

bu özel bir API mı? Bunu uygulamamda kullanırsam reddedilir miyim?
Frank

orada hiç özel arama yok gibi görünüyor
Anthony Main

eskiden tabbar özelliği erişilemezdi.
coneybeare

bu, daha çok ilgimi çekebileceğim "seçili öğe" vurgusunu değil, sekme çubuğu arka planını değiştirir
smdvlpr

105

iOS 5, çoğu kullanıcı arayüzü öğesinin görünümünü özelleştirmek için bazı yeni görünüm yöntemleri ekledi.

Görünüm proxy'sini kullanarak uygulamanızda bir UITabBar'ın her örneğini hedefleyebilirsiniz.

İOS 5 + 6 için:

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

İOS 7 ve üzeri için lütfen aşağıdakileri kullanın:

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

Görünüm proxy'sini kullanmak, uygulama boyunca herhangi bir sekme çubuğu örneğini değiştirir. Belirli bir örnek için, o sınıftaki yeni özelliklerden birini kullanın:

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

3
Hayır! Daha önce de belirttiğim gibi, bunlar iOS 5 içindir. Koşullu derleme ifadeleriyle belirli sürümleri her zaman hedefleyebilirsiniz: cocoawithlove.com/2010/07/…
imnk

Teşekkürler, yardımcı oldu :) Böyle bir şey olduğunu hiç bilmiyordum.
Veeru

İOS 7 için, arka plan rengini değiştirmek istiyorsanız [UITabBar görünümü] setBarTintColor kullanın
Zeezer

34

Son cevaba bir ekim var. Temel şema doğru olsa da, kısmen şeffaf bir renk kullanmanın hilesi geliştirilebilir. Bunun yalnızca varsayılan gradyanın görünmesine izin vermek için olduğunu varsayıyorum. Ayrıca, TabBar'ın yüksekliği en azından OS 3'te 48 yerine 49 pikseldir.

Dolayısıyla, gradyan içeren uygun bir 1 x 49 görüntünüz varsa, kullanmanız gereken viewDidLoad sürümü budur:

- (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
bir arka plan resmiyle güzelleştirmek istiyorsanız
oberbaum

1
Sanırım şöyle olması gerekiyor: [[self tabBar] insertSubview: v atIndex: 0];
Vibhor Goyal

Cevabın eski olduğunu biliyorum ama bu benim için çalıştı. Renk yerine özel bir resme ihtiyacım olduğu için, cevabınızı çubuklardaki
RaphaelDDL

27

AddSubview'i yalnızca kullandığınızda düğmeleriniz tıklanabilirliği kaybeder, bu nedenle

[[self tabBar] addSubview:v];

kullanım:

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

7

Bunu yapmanın basit bir yolu yoktur, temelde UITabBar'ı alt sınıflara ayırmanız ve istediğinizi yapmak için özel çizimi uygulamanız gerekir. Etkisi için epey bir çalışma ama buna değebilir. Gelecekteki bir iPhone SDK'sına eklemek için Apple ile bir hata dosyalamanızı öneririm.


4
Efendim, bir böceği elma ile mi doldurdunuz?
Sagar R. Kothari

7

Aşağıdakiler bunun için mükemmel bir çözümdür. Bu, iOS5 ve iOS4 için benim için iyi çalışıyor.

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

tabBarcontroller nedir UITabarDelegate ile uyumlu bir kontrolördür.
iCoder

7

İOS 7'de:

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

Ayrıca görsel isteklerinize göre önce ayarlamanızı tavsiye ederim:

[[UITabBar appearance] setBarStyle:UIBarStyleBlack];

Çubuk stili, görünüm içeriğiniz ile sekme çubuğunuz arasına ince bir ayırıcı koyar.


5

[[self tabBar] insertSubview:v atIndex:0]; benim için mükemmel çalışıyor.


5

benim için Tabbar'ın rengini değiştirmek çok basit: -

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


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

Bunu dene!!!


İyi çalışıyor! +1 sizin için.
YSR hayranı

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

2

sadece arka plan rengi için

Tabbarcontroller.tabBar.barTintColor=[UIColor redcolour];

veya bu Uygulama Temsilcisi'nde

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

sekme çubuğunun seçili olmayan simgelerinin rengini değiştirmek için

İOS 10 için:

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

İOS 10'un üstünde:

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

1

Mevcut cevaplarda bazı iyi fikirler var, birçoğu biraz farklı çalışıyor ve ne seçeceğiniz, hangi cihazları hedeflediğinize ve ne tür bir görünüm elde etmeyi hedeflediğinize bağlı olacaktır. UITabBargörünüşünü özelleştirmeye geldiğinde herkesin bildiği gibi mantıksız, ancak işte yardımcı olabilecek birkaç püf noktası:

1). Daha düz bir görünüm için parlak kaplamadan kurtulmak istiyorsanız şunları yapın:

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

2). Özel görüntüleri tabBar düğmelerine ayarlamak için aşağıdaki gibi bir şey yapın:

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

Nerede selectedve unselectedHangi UIImageseçtiğiniz nesneler. Düz bir renk olmasını isterseniz, bulduğum en basit çözüm UIView, istenen ile bir tane oluşturmak backgroundColorve ardından onu UIImageQuartzCore yardımıyla sadece bir a haline getirmek. Görünümün içeriğiyle UIViewbir almak için bir kategoride aşağıdaki yöntemi kullanıyorum UIImage:

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

3) Son olarak, düğmelerin başlıklarının stilini özelleştirmek isteyebilirsiniz. Yapmak:

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

Bu, bazı ayarlamalar yapmanızı sağlar, ancak yine de oldukça sınırlıdır. Özellikle, metnin düğme içinde nereye yerleştirileceğini özgürce değiştiremezsiniz ve seçili / seçilmemiş düğmeler için farklı renklere sahip olamazsınız. Daha spesifik bir metin düzeni yapmak istiyorsanız, sadece UITextAttributeTextColornet olacak şekilde ayarlayın ve metninizi bölüm (2) 'den selectedve unselectedresimlerine ekleyin .



0

Başka bir çözüm (bir hack'tir) tabBarController'daki alfayı 0.01'e ayarlamaktır, böylece neredeyse görünmez, ancak yine de tıklanabilir. Ardından, alfa'lı sekme Çubuğu'nun altında özel sekme çubuğu görüntünüzle birlikte MainWindow ucunun altında bir ImageView denetimi ayarlayın. Ardından, sekme çubuğu denetleyicisi görünümleri değiştirdiğinde görüntüleri değiştirin, renkleri değiştirin veya vurgulayın.

Ancak, '... daha fazlasını' kaybedersiniz ve işlevselliği özelleştirirsiniz.


0

Merhaba iOS SDK 4 kullanıyorum ve bu sorunu sadece iki satır kodla çözebildim ve böyle gidiyor

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

Bu yardımcı olur umarım!


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

0

Hızlı 3.0 yanıtı: (Vaibhav Gaikwad'dan)

Sekme çubuğunun seçilmemiş simgelerinin rengini değiştirmek için:

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

Yalnızca metin rengini değiştirmek için:

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

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

0

Swift 3'ün görünümünü kullanarak AppDelegateşunları yapın:

UITabBar.appearance().barTintColor = your_color

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.