Bagaimana cara mengatur font & warna judul di UINavigationBar menggunakan API penampilan iOS5?


90

Saya memiliki beberapa View Controllers dan saya ingin mengatur warna font semuanya menjadi merah.

 [[UINavigationBar appearance] setFont:[UIFont boldSystemFontOfSize:12.0]];

melempar kesalahan pemilih yang tidak dikenal.

Bagaimana cara memperbaikinya?


Kemudian Anda harus mengatur label dan tampilan di bilah navigasi dan mengatur warna font
vishiphone

Jawaban:


207

Dari Ray Wenderlich:

http://www.raywenderlich.com/4344/user-interface-customization-in-ios-5

// Customize the title text for *all* UINavigationBars
[[UINavigationBar appearance] setTitleTextAttributes:
    [NSDictionary dictionaryWithObjectsAndKeys:
        [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0], 
        UITextAttributeTextColor, 
        [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8], 
        UITextAttributeTextShadowColor, 
        [NSValue valueWithUIOffset:UIOffsetMake(0, -1)], 
        UITextAttributeTextShadowOffset, 
        [UIFont fontWithName:@"Arial-Bold" size:0.0], 
        UITextAttributeFont, 
        nil]];

Atau jika Anda lebih suka dengan gaya literal objek:

[[UINavigationBar appearance] setTitleTextAttributes:@{
    UITextAttributeTextColor: [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0],
    UITextAttributeTextShadowColor: [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8],
    UITextAttributeTextShadowOffset: [NSValue valueWithUIOffset:UIOffsetMake(0, -1)],
    UITextAttributeFont: [UIFont fontWithName:@"Arial-Bold" size:0.0],
}];

Edit untuk iOS 7 dan setelahnya

UITextAttributes tidak digunakan lagi karena iOS 7 Anda dapat menggunakan yang berikut ini:

NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor colorWithWhite:.0f alpha:1.f];
shadow.shadowOffset = CGSizeMake(0, -1);

[[UINavigationBar appearance] setTitleTextAttributes:@{
     NSForegroundColorAttributeName: [UIColor whiteColor],
     NSShadowAttributeName: shadow,
     NSFontAttributeName: [UIFont fontWithName:@"Arial-Bold" size:15.0f]
     }];

1
Selama lebih dari 1 jam, saya berjuang dengan bagian kode dari tutorial, yang menyebabkan pemotongan judul item navigasi saya setelah dorongan pertama ... Hati-hati dengan ukuran font, yang merupakan masalah dalam situasi saya ... Tampaknya ukuran 0,0 tidak bekerja untuk saya ...
Bartu

3
kamus literal baru akan membuat ini jauh lebih cantik
tybro0103

Sebagai catatan tambahan ini hanya 5.0+, jika Anda mendukung 4 maka itu layak dilakukan if ([navBarInstance respondsToSelector:@selector(appearance)])terlebih dahulu karena itu akan merusak versi iOS di bawah 5.
Adam Waite

1
Nama font salah dan merusak aplikasi. Cobalah sesuatu seperti Arial-BoldMT.
MacMark

17
TIL UITextAttributeTextColortidak digunakan lagi dan mendukung NSForegroundColorAttributeNamedi iOS 7
Brenden

23

Untuk target penerapan yang lebih besar dari atau sama dengan iOS 6, Anda harus menggunakan NSShadow:

NSShadow * shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor lightGrayColor];
shadow.shadowOffset = CGSizeMake(0, -2);

NSDictionary * navBarTitleTextAttributes =
@{ NSForegroundColorAttributeName : [UIColor redColor],
   NSShadowAttributeName          : shadow,
   NSFontAttributeName            : [UIFont systemFontOfSize:14] };

[[UINavigationBar appearance] setTitleTextAttributes:navBarTitleTextAttributes];

masukkan deskripsi gambar di sini


19

Melakukan ini di iOS 8+ dan di Swift. Tidak ada setTitleTextAttributesuntuk objek penampilan. Sebaliknya, lakukan ini:

UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : AppTheme.fontWithSize(18)]

5

Saya melakukan ini dengan menambahkan hanya beberapa baris kode di kelas AppDelegate.m metode didFinishLaunchingWithOptions: Gunakan kode ini:

NSDictionary *navbarTitleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                           [UIColor colorWithRed:255.0f/255.0f green:0.0f/255.0f blue:0.0f/255.0f alpha:1.0],UITextAttributeTextColor,
                                           [UIColor clearColor], UITextAttributeTextShadowColor,
                                           [NSValue valueWithUIOffset:UIOffsetMake(-1, 0)], UITextAttributeTextShadowOffset, nil];

[[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];

itu berhasil untuk saya ...


5

Jika Anda perlu melakukan ini di Swift, Anda dapat membuat ekstensi untuk UINavigationBar untuk memungkinkan Anda mendapatkan atau menyetel pengaturan ini.

extension UINavigationBar {
var titleColor: UIColor? {
    get {
        if let attributes = self.titleTextAttributes {
            return attributes[NSForegroundColorAttributeName] as? UIColor
        }
        return nil
    }
    set {
        if let value = newValue {
            self.titleTextAttributes = [NSForegroundColorAttributeName: value]
        }
    }
}

var titleFont: UIFont? {
    get {
        if let attributes = self.titleTextAttributes {
            return attributes[NSFontAttributeName] as? UIFont
        }
        return nil
    }
    set {
        if let value = newValue {
            self.titleTextAttributes = [NSFontAttributeName: value]
        }
    }
    }
}

Anda kemudian dapat mengatur warna dan font seperti ini:

navigationBar.titleColor = UIColor.redColor()
navigationBar.titleFont = UIFont.systemFontOfSize(12)

Saya kira solusi ini berfungsi jika Anda menggunakan salah satu titleColoratau satu titleFontper satu. Jika Anda menggunakannya bersama-sama, nilai self.titleTextAttributesakan disetel ke nilai baru setiap kali salah satu variabel dipanggil. Penyetel mungkin bisa mendapatkan nilai lain saat membuat kamus baru.
pengguna023

1

Ini dapat digunakan untuk menyetel tampilan kustom ke satu navigationBar alih-alih pengaturan global

- (void)updateTitleWithString:(NSString *)title
{
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectZero];
    [headerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
    [headerView setAutoresizesSubviews:YES];

    CGFloat headFontSize = (IS_SYSTEM_DEVICE_IPAD ? 25.0f : 19.0f);
    UIFont *headFont = [UIFont boldSystemFontOfSize: headFontSize ];

    NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    [style setLineBreakMode:NSLineBreakByTruncatingTail];

    CGSize size = [title boundingRectWithSize:CGSizeMake(190,headFontSize + 6) options:NSStringDrawingUsesLineFragmentOrigin
                                   attributes:@{NSFontAttributeName : headFont, NSParagraphStyleAttributeName : style} context:nil].size;

    headerView.frame  = CGRectMake(0, 0,size.width,self.navigationController.navigationBar.frame.size.height);
    float labelHeight = headFontSize + 6;
    float labelYLoc   = (   self.navigationController.navigationBar.frame.size.height - labelHeight ) / 2;
    UILabel *label    = [[UILabel alloc] initWithFrame:CGRectMake(0,labelYLoc, size.width,labelHeight)];
    label.backgroundColor = [UIColor clearColor];
    label.adjustsFontSizeToFitWidth = YES;
    label.textAlignment = NSTextAlignmentCenter;
    label.textColor = [UIColor whiteColor];
    label.font = headFont;
    label.text = title;
    label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.4];
    label.lineBreakMode = NSLineBreakByTruncatingTail;
    label.shadowOffset = CGSizeMake(0,-1);
    label.accessibilityLabel = @"<LABEL>";
    [headerView addSubview:label];

    self.navigationItem.titleView = headerView;
}

-5

Gunakan baris kode ini

UILabel *badge_Label=[[UILabel alloc]initWithFrame:CGRectMake(5,3, 15, 15)];
badge_Label.backgroundColor=[UIColor redcolor];
badge_Label.font=[UIFont systemFontOfSize:12];
[badge_Label setText:@"20"];
[self.navigationController.navigationBar addSubview:badgelabel];

Saya pikir ini akan membantu Anda.


saya tahu ini, saya mencoba menggunakan fitur proxy dari API tampilan
carbonr
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.