Mengubah Warna Rona / Latar Belakang UITabBar

87

UINavigationBar dan UISearchBar keduanya memiliki properti tintColor yang memungkinkan Anda mengubah warna tint (mengejutkan, saya tahu) dari kedua item tersebut. Saya ingin melakukan hal yang sama ke UITabBar di aplikasi saya, tetapi sekarang telah menemukan cara untuk mengubahnya dari warna hitam default. Ada ide?

piksel
sumber
Ini adalah jawaban yang bagus. Jika Anda mengizinkan rotasi otomatis, sebaiknya setel AutoresizingMask subview agar memiliki margin dan ukuran yang fleksibel, atau latar belakang baru tidak akan diubah ukurannya dengan bilah tab.
pmdj

Jawaban:

47

Saya telah dapat membuatnya bekerja dengan membuat subclass UITabBarController dan menggunakan kelas privat:

@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
sumber
1
Ini adalah solusi yang aneh karena hanya menempatkan persegi panjang coklat semi transparan di atas bilah tab. Masalahnya adalah semua tombol berubah menjadi coklat, bukan hanya latar belakang. Namun ini tampaknya menjadi pilihan terbaik yang disajikan siapa pun sejauh ini.
Yunus
apakah ini API pribadi? jika saya menggunakan ini di aplikasi saya, apakah saya akan ditolak?
Frank
tampaknya tidak ada panggilan pribadi di sana
Anthony Main
properti tabbar dulu tidak dapat diakses.
coneybeare
ini mengubah latar belakang tabbar, bukan sorotan "item yang dipilih", yang saya akan lebih tertarik
smdvlpr
105

iOS 5 telah menambahkan beberapa metode tampilan baru untuk menyesuaikan tampilan sebagian besar elemen UI.

Anda dapat menargetkan setiap instance UITabBar di aplikasi Anda dengan menggunakan proxy tampilan.

Untuk iOS 5 + 6:

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

Untuk iOS 7 ke atas, gunakan yang berikut ini:

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

Menggunakan proxy tampilan akan mengubah semua contoh bilah tab di seluruh aplikasi. Untuk contoh tertentu, gunakan salah satu properti baru di kelas itu:

UIColor *tintColor; // iOS 5+6
UIColor *barTintColor; // iOS 7+
UIColor *selectedImageTintColor;
UIImage *backgroundImage;
UIImage *selectionIndicatorImage;
imnk
sumber
3
Nggak. Seperti yang saya tunjukkan, ini untuk iOS 5. Anda selalu dapat menargetkan versi tertentu dengan pernyataan kompilasi bersyarat: cocoawithlove.com/2010/07/…
imnk
Terima kasih, itu sangat membantu :) Tidak pernah tahu ada hal seperti itu.
Veeru
Untuk iOS 7, gunakan [penampilan UITabBar] setBarTintColor, jika Anda ingin mengubah warna latar belakang
Zeezer
34

Saya memiliki tambahan untuk jawaban akhir. Meskipun skema esensial benar, trik menggunakan warna transparan sebagian dapat diperbaiki. Saya berasumsi bahwa itu hanya untuk membiarkan gradien default ditampilkan. Oh, juga, tinggi TabBar adalah 49 piksel daripada 48, setidaknya di OS 3.

Jadi, jika Anda memiliki gambar berukuran 1 x 49 yang sesuai dengan gradien, ini adalah versi viewDidLoad yang harus Anda gunakan:

- (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.dll
sumber
1
jika Anda ingin membuatnya cantik dengan gambar latar belakang, lihat ini: duivesteyn.net/2010/01/16/iphone-custom-tabbar-background-image
oberbaum
1
Saya pikir itu harus: [[self tabBar] insertSubview: v atIndex: 0];
Vibhor Goyal
Saya tahu jawabannya sudah lama tetapi itu berhasil untuk saya. Karena saya membutuhkan gambar khusus alih-alih warna, saya mencampur jawaban Anda dengan warna yang
RaphaelDDL
27

Saat Anda hanya menggunakan addSubview, tombol Anda akan kehilangan kemampuan untuk diklik, jadi bukannya

[[self tabBar] addSubview:v];

menggunakan:

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

Tidak ada cara sederhana untuk melakukan ini, pada dasarnya Anda perlu membuat subclass UITabBar dan mengimplementasikan gambar kustom untuk melakukan apa yang Anda inginkan. Ini cukup merepotkan untuk mendapatkan efeknya, tetapi mungkin sepadan. Saya sarankan untuk melaporkan bug dengan Apple untuk menambahkannya ke SDK iPhone di masa mendatang.

Louis Gerbarg
sumber
4
Pak, apakah Anda mengisi bug dengan apel?
Sagar R. Kothari
7

Berikut ini adalah solusi sempurna untuk ini. Ini berfungsi dengan baik dengan saya untuk iOS5 dan 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
sumber
apa itu tabBarcontroller Apakah itu pengontrol yang sesuai UITabarDelegate Can u menjelaskan tlg?
iCoder
7

Di iOS 7:

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

Saya juga merekomendasikan pengaturan terlebih dahulu tergantung pada keinginan visual Anda:

[[UITabBar appearance] setBarStyle:UIBarStyleBlack];

Gaya bilah menempatkan pemisah halus antara konten tampilan dan bilah tab Anda.

capikaw.dll
sumber
5

[[self tabBar] insertSubview:v atIndex:0]; bekerja dengan sempurna untuk saya.

jimmy
sumber
5

bagi saya sangat mudah untuk mengubah warna Tabbar seperti: -

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


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

Coba ini!!!

Muhammad Rizwan
sumber
Bekerja dengan baik! 1 untukmu.
Kipas YSR
3
 [[UITabBar appearance] setTintColor:[UIColor redColor]];
 [[UITabBar appearance] setBarTintColor:[UIColor yellowColor]];
Hsm
sumber
2

hanya untuk warna latar belakang

Tabbarcontroller.tabBar.barTintColor=[UIColor redcolour];

atau ini di Delegasi Aplikasi

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

untuk mengubah warna ikon batal pilih tabbar

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

Di atas iOS 10:

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

Ada beberapa ide bagus dalam jawaban yang ada, banyak yang berfungsi sedikit berbeda dan apa yang Anda pilih juga akan bergantung pada perangkat yang Anda targetkan dan jenis tampilan yang ingin Anda capai. UITabBarterkenal tidak intuitif saat harus menyesuaikan tampilannya, tetapi berikut beberapa trik yang dapat membantu:

1). Jika Anda ingin menghilangkan overlay glossy untuk tampilan yang lebih datar, lakukan:

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

2). Untuk mengatur gambar khusus ke tombol tabBar lakukan sesuatu seperti:

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

Dimana selecteddan unselectedberadaUIImage objek pilihan Anda. Jika Anda ingin mereka menjadi warna datar, solusi paling sederhana yang saya temukan adalah membuat UIViewdengan yang diinginkan backgroundColordan kemudian mengubahnya menjadi a UIImagedengan bantuan QuartzCore. Saya menggunakan metode berikut dalam kategori di UIViewuntuk mendapatkan UIImagedengan konten tampilan:

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

3) Terakhir, Anda mungkin ingin menyesuaikan gaya judul tombol. Melakukan:

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

Ini memungkinkan Anda melakukan beberapa penyesuaian, tetapi masih sangat terbatas. Khususnya, Anda tidak dapat dengan bebas mengubah tempat teks ditempatkan di dalam tombol, dan tidak dapat memiliki warna berbeda untuk tombol yang dipilih / tidak dipilih. Jika Anda ingin membuat tata letak teks yang lebih spesifik, cukup atur UITextAttributeTextColormenjadi jelas dan tambahkan teks Anda ke dalam selecteddan unselectedgambar dari bagian (2).

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

Solusi lain (yang merupakan peretasan) adalah menyetel alfa pada tabBarController ke 0,01 sehingga hampir tidak terlihat namun masih dapat diklik. Kemudian setel kontrol ImageView di bagian bawah ujung MainWindow dengan gambar tabbar kustom Anda di bawah tabBarCOntroller alfa. Kemudian tukar gambar, ubah warna atau hightlight saat tabbarcontroller berganti tampilan.

Namun, Anda kehilangan '... more' dan menyesuaikan fungsionalitas.

pengguna855723
sumber
0

Hai, Saya menggunakan iOS SDK 4 dan saya dapat menyelesaikan masalah ini hanya dengan dua baris kode dan berjalan seperti ini

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

Semoga ini membantu!

Jorge Vicente Mendoza
sumber
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];
}
pengguna1049755
sumber
0

Jawaban Swift 3.0: (dari Vaibhav Gaikwad)

Untuk mengubah warna ikon batal memilih tabbar:

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

Untuk mengubah warna teks saja:

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

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

Swift 3 menggunakan tampilan dari Anda AppDelegatemelakukan hal berikut:

UITabBar.appearance().barTintColor = your_color

Bobj-C
sumber