iOS 7 UIBarButton tombol panah kembali warna

172

Saya mencoba mengubah panah tombol kembali

masukkan deskripsi gambar di sini

Saat ini saya menggunakan yang berikut ini untuk mengontrol ukuran teks serta warna teks pada tombol kembali:

[[UIBarButtonItem appearance] setTitleTextAttributes:
  [NSDictionary dictionaryWithObjectsAndKeys:
    [UIColor whiteColor], UITextAttributeTextColor,
    [UIFont boldSystemFontOfSize:16.0f], UITextAttributeFont,
    [UIColor darkGrayColor], UITextAttributeTextShadowColor,
    [NSValue valueWithCGSize:CGSizeMake(0.0, -1.0)], UITextAttributeTextShadowOffset,
  nil] forState:UIControlStateNormal];

tetapi jika saya hanya ingin mengubah warna panah untuk tombol kembali, apa yang harus saya lakukan?

kevinl
sumber
Apakah Anda menemukan solusi untuk mengubah warna panah untuk tombol kembali?
OnkarK
1
@OMK Saya akhirnya mengubah infolistproperty NavBarColor saya untuk membuatnya berfungsi dan kemudian mengatur warna navbarcolor yang sebenarnya menjadi warna yang berbeda. Saya tidak yakin apa yang sedang terjadi, tetapi solusi itu berhasil untuk saya
kevinl
1
Perilaku dari beberapa properti UINavigationBartelah berubah dari iOS 7. Lihatlah Jawaban untuk melihat efek dari beberapa Properti lainnya juga.
Bhavin
tolong bantu dengan masalah ini: stackoverflow.com/questions/29923813/…
MIloš Kresović

Jawaban:

438

Untuk mengubah warna chevron tombol kembali untuk pengontrol navigasi tertentu *:

self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

* Jika Anda menggunakan aplikasi dengan lebih dari 1 pengontrol navigasi, dan Anda ingin warna chevron ini berlaku untuk masing-masing, Anda mungkin ingin menggunakan proksi penampilan untuk mengatur chevron tombol kembali untuk setiap pengontrol navigasi, sebagai berikut:

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

Dan untuk ukuran yang baik, dengan cepat (terima kasih kepada Jay Mayu dalam komentar):

UINavigationBar.appearance().tintColor = UIColor.whiteColor()
DiscDev
sumber
3
Ini hanya akan berlaku di seluruh aplikasi jika Anda menggunakan pengontrol navigasi yang sama untuk seluruh aplikasi Anda. Saya sebenarnya merekomendasikan saran Bart.
Kyle Clegg
1
Saya memperbarui jawaban saya dengan catatan tentang beberapa pengontrol navigasi. Saya masih tidak setuju bahwa saran Bart adalah jawaban yang "benar", karena ada banyak efek samping lain ketika Anda mengatur warna seluruh aplikasi. Ditambah lagi, pertanyaan awal tidak menanyakan bagaimana tema keseluruhan aplikasi, itu hanya bertanya bagaimana tema tombol kembali.
DiscDev
1
Ini sepertinya tidak mengatur warna chevron belakang.
jcampbell1
2
@ jcampbell1 - Saya berhasil menggunakan ini di beberapa aplikasi saya ... mungkin Anda tidak membaca peringatan tentang beberapa UINavigationControllers.
DiscDev
7
untuk cepatUINavigationBar.appearance().tintColor = UIColor.whiteColor()
Jay Mayu
57

Anda harus mengatur tintColor dari seluruh aplikasi.

self.window.tintColor = [UIColor redColor];

Atau di Swift 3:

self.window?.tintColor = UIColor.blue

Sumber: Panduan Transisi UI iOS 7

Bart van Kuik
sumber
4
Jika Anda hanya ingin mengatur warna chevron tombol kembali (dan bukan seluruh aplikasi), seperti yang dinyatakan dalam pertanyaan awal, ini adalah jawaban yang salah. Lihat jawaban saya di sini untuk jawaban yang benar: stackoverflow.com/a/18809412/1103584
DiscDev
Saya menggunakan ini dalam delegasi aplikasi saya untuk mengubah tombol kembali menjadi hitam. Tempatkan di metode applicationDidFinishLaunchingWithOptions ... window.tintColor = [UIColor blackColor];
Marc Watson
Ini tidak bisa bekerja di iOS 6. Ada yang tahu apa yang harus dilakukan?
Gavjr
1
Ini menyebabkannya memengaruhi tintColor seluruh aplikasi, yang mencakup UIActivityViewController (untuk berbagi) dan MFMailComposeViewController (untuk mengirim email). Dialog-dialog tersebut menganggap tintColor belum dimodifikasi dengan .... dan dapat mengakibatkan beberapa interaksi warna yang buruk.
Mike Lambert
Ini mengubah warna rona banyak objek lain, seperti kursor yang berkedip UITextField. Jelas tidak direkomendasikan.
Hunter Monk
55

Anda dapat mengatur warna pada bilah navigasi seluruh aplikasi menggunakan metode ini

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions{
    [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
}
David Castro
sumber
23

Dimungkinkan untuk mengubah hanya warna panah (bukan warna judul tombol kembali) dengan cara ini:

[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

Bilah navigasi berisi subview dari tipe _UINavigationBarBackIndicatorView (item terakhir dalam array subview) yang mewakili panah.

Hasilnya adalah bilah navigasi dengan berbagai warna panah tombol kembali dan judul tombol kembali

selmad
sumber
4
Tergantung pada urutan subview dari tampilan sistem adalah ide yang buruk.
Glenn Maynard
2
ini berhasil, ketika pengaturan self.navigationController.navigationBar.tintColor tidak berfungsi.
Rich Fox
@ GlennMaynard Anda benar — cara terbaik untuk menerapkannya adalah dengan mengulangi melalui larik subview yang dikembalikan self.navigationController.navigationBar.subviewshingga tombol kembali ditemukan.
Evan R
@ EvanR sementara solusi selmad berhasil bagi saya, iterasi melalui array subview tidak (yang saya coba dulu karena saya setuju dengan Anda bahwa akan lebih bijaksana untuk melakukannya). Jika itu berhasil untuk Anda- silakan tambahkan contoh. Terima kasih.
jungledev
22

Jika Anda menggunakan storyboard, Anda dapat mengatur warna bilah navigasi.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

USeFuL
sumber
Persis apa yang saya cari. Terima kasih!
Chad Lewis
11

Di dalam rootViewController yang menginisialisasi navigationController, saya meletakkan kode ini di dalam metode viewDidAppear saya:

//set back button color
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], UITextAttributeTextColor,nil] forState:UIControlStateNormal];
//set back button arrow color
[self.navigationController.navigationBar setTintColor:[UIColor whiteColor]];
John Riselvato
sumber
2
UITextAttributeTextColor sudah tidak digunakan lagi di iOS 7 - gunakan NSForegroundColorAttributeName
amergin
7

Di iOS 6, tintColor mewarnai latar belakang bilah navigasi, bilah tab, bilah alat, bilah pencarian, dan bilah lingkup. Untuk mewarnai latar belakang bilah di iOS 7, gunakan properti barTintColor.

iOS 7 Design Resources iOS 7 UI Transition Guide

Chamath Jeevan
sumber
2
Ini adalah salah satunya! ... taruh di delegasi aplikasi. Bekerja seperti pesona! window.tintColor = [UIColor blackColor]; // Aku ingin yang hitam
Marc Watson
6

Anda dapat mengatur tintColorproperti pada tombol (atau item tombol batang) atau tampilan pengontrol tampilan. Secara default, properti akan mewarisi warna dari tampilan induk, sampai ke tingkat atas UIWindowaplikasi Anda.

Mike Weller
sumber
1
terima kasih atas tanggapannya. Namun, ini bekerja sedikit berbeda pada iOS 7. Kode lama saya menggunakan tintColor, tetapi iOS 7 sepertinya tidak terlalu menyukainya. Saya akhirnya menggunakan panduan transisi resmi Apple Dev iOS 7 untuk memperbaiki beberapa masalah UI
kevinl
Lihat jawaban saya untuk contoh terpisah tentang bagaimana melakukan ini: stackoverflow.com/a/18809412/1103584
DiscDev
5

Saya harus menggunakan keduanya:

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] 
                     setTitleTextAttributes:[NSDictionary 
               dictionaryWithObjectsAndKeys:[UIColor whiteColor], UITextAttributeTextColor,nil] 
                                   forState:UIControlStateNormal];

[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor whiteColor]];

Dan bekerja untuk saya, terima kasih untuk semuanya!

Márcia Silva
sumber
5
UINavigationBar *nbar = self.navigationController.navigationBar;

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
   //iOS 7
   nbar.barTintColor = [UIColor blueColor]; // bar color
   //or custom color 
   //[UIColor colorWithRed:19.0/255.0 green:86.0/255.0 blue:138.0/255.0 alpha:1];

   nbar.navigationBar.translucent = NO;

   nbar.tintColor = [UIColor blueColor]; //bar button item color

} else {
   //ios 4,5,6
   nbar.tintColor = [UIColor whiteColor];
   //or custom color
   //[UIColor colorWithRed:19.0/255.0 green:86.0/255.0 blue:138.0/255.0 alpha:1];

}
MaxEcho
sumber
Bagus. Itu membantu saya. Terima kasih
Yogesh Lolusare
4

Perbarui Swift 3

navigationController?.navigationItem.rightBarButtonItem?.tintColor = UIColor.yellow
navigationController?.navigationBar.tintColor = UIColor.red
navigationController?.navigationBar.barTintColor = UIColor.gray
navigationController?.navigationBar.titleTextAttributes =  [NSForegroundColorAttributeName: UIColor.blue]

Hasil: masukkan deskripsi gambar di sini

Ricardo Mutti
sumber
3

Hanya untuk mengubah NavigationBarwarna, Anda dapat mengatur warna warna seperti di bawah ini.

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
Khash Nejad
sumber
Ini tidak akan mempengaruhi warna warna di iOS 7. Menurut dokumen: "Mengatur properti tintColor dengan menggunakan API proksi penampilan tidak didukung di iOS 7." tautan
bachonk
3

Jika Anda membuat tombol kembali kustom berdasarkan UIButton dengan gambar panah, berikut adalah cuplikan subkelas. Menggunakannya, Anda dapat membuat tombol dalam kode atau hanya menetapkan kelas di Interface Builder ke UIButton apa pun. Panah Kembali Gambar akan ditambahkan secara otomatis dan diwarnai dengan warna teks.

@interface UIImage (TintColor)

- (UIImage *)imageWithOverlayColor:(UIColor *)color;

@end


@implementation UIImage (TintColor)

- (UIImage *)imageWithOverlayColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height);

    if (UIGraphicsBeginImageContextWithOptions) {
        CGFloat imageScale = 1.0f;
        if ([self respondsToSelector:@selector(scale)])
            imageScale = self.scale;
        UIGraphicsBeginImageContextWithOptions(self.size, NO, imageScale);
    }
    else {
        UIGraphicsBeginImageContext(self.size);
    }

    [self drawInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(context, kCGBlendModeSourceIn);

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

@end




#import "iOS7backButton.h"

@implementation iOS7BackButton

-(void)awakeFromNib
{
    [super awakeFromNib];

    BOOL is6=([[[UIDevice currentDevice] systemVersion] floatValue] <7);
    UIImage *backBtnImage = [[UIImage imageNamed:@"backArrow"] imageWithOverlayColor:self.titleLabel.textColor];
    [self setImage:backBtnImage forState:UIControlStateNormal];
    [self setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];
    [self setImageEdgeInsets:UIEdgeInsetsMake(0, is6?0:-10, 0, 0)];


}


+ (UIButton*) buttonWithTitle:(NSString*)btnTitle andTintColor:(UIColor*)color {
    BOOL is6=([[[UIDevice currentDevice] systemVersion] floatValue] <7);
    UIButton *backBtn=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 60, 30)];
    UIImage *backBtnImage = [[UIImage imageNamed:@"backArrow"] imageWithOverlayColor:color];
    [backBtn setImage:backBtnImage forState:UIControlStateNormal];
    [backBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, is6?5:-5, 0, 0)];
    [backBtn setImageEdgeInsets:UIEdgeInsetsMake(0, is6?0:-10, 0, 0)];
    [backBtn setTitle:btnTitle forState:UIControlStateNormal];
    [backBtn setTitleColor:color /*#007aff*/ forState:UIControlStateNormal];

    return backBtn;
}

@end

gambar tombol kembali @ 2x

Eugene Braginets
sumber
3

Jika Anda ingin mengubah hanya Panah Kembali TAPI di seluruh aplikasi, lakukan ini:

[[NSClassFromString(@"_UINavigationBarBackIndicatorView") appearance] 
  setTintColor:[UIColor colorWithHexString: @"#f00000"]];
orkenstein
sumber
Ada kemungkinan ini akan membuat Anda ditolak dari app store
Luke
@ Lukas, saya sudah berhasil menggunakannya beberapa kali. Tidak ada penolakan. Tapi, ya, kesempatan masih ada.
orkenstein
Kemungkinan masih akan rusak di versi iOS masa depan
Lope
1
@Lope, ya, kenapa tidak. Saya tidak mencari peluru perak.
orkenstein
Iterasi melalui subview pada iOS 10.1 menunjukkan bahwa itu masih merupakan nama kelas, tetapi pengaturan tampilan seperti yang ditunjukkan di sini tidak berpengaruh bagi saya.
arlomedia
2

Di iOS 7, Anda dapat memasukkan baris kode berikut ke application:didFinishLaunchingWithOptions:dalam AppDelegate.mfile Anda :

[[UINavigationBar appearance] setTintColor:myColor];

Setel myColorke warna yang Anda inginkan tombol kembali berada di seluruh aplikasi. Tidak perlu meletakkannya di setiap file.

Geo1088
sumber
0

Swift 2.0: Bilah & tombol Navigasi Mewarnai

navigationController?.navigationBar.barTintColor = UIColor.blueColor()
navigationController?.navigationBar.tintColor = UIColor.whiteColor()
navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
AbhinayMe
sumber
0

Dalam cepat 3, untuk mengubah warna panah tombol kembali UIBarButton

self.navigationController?.navigationBar.tintColor = UIColor.black
Dilip Jangid
sumber