İOS5 görünüm API'sini kullanarak UINavigationBar'da başlığın yazı tipi ve rengi nasıl ayarlanır?


90

Birden fazla Görüntü Denetleyicim var ve hepsinin yazı tipi rengini kırmızı olarak ayarlamak istiyorum.

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

tanınmayan bir seçici hatası veriyor.

Bunu nasıl düzeltebilirim?


Ardından, gezinme çubuğundaki etiketi ve görünümü ve yazı tipi rengini ayarlamalısınız
vishiphone

Yanıtlar:


207

Ray Wenderlich'ten:

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

Veya nesne değişmez stilini tercih ederseniz:

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

İOS 7 ve sonrası için düzenleyin

UITextAttributes, iOS 7 olarak kullanımdan kaldırıldı, aşağıdakileri kullanabilirsiniz:

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
1 saatten fazla bir süredir, öğreticideki kodun bu kısmı ile mücadele ediyordum, bu da ilk basıştan sonra gezinme öğemin başlığını kırpmaya neden oluyor ... Benim durumumdaki sorun olan yazı tipi boyutuna dikkat edin ... Görünüşe göre boyut 0.0 benim için işe yaramadı ...
Bartu

3
yeni sözlük kelimesi bunu çok daha güzel yapacak
tybro0103

Bir yan not olarak, bu yalnızca 5.0+, 4'ü destekliyorsanız, o zaman if ([navBarInstance respondsToSelector:@selector(appearance)])önce yapmaya değer çünkü 5'in altındaki iOS sürümlerini çökertecek.
Adam Waite

1
Yazı tipi adı yanlış ve uygulamayı çökertiyor. Arial-BoldMT gibi bir şey deneyin.
MacMark

17
TIL UITextAttributeTextColor, NSForegroundColorAttributeNameiOS 7'nin lehine kullanımdan kaldırıldı
Brenden

23

İOS 6'dan büyük veya ona eşit dağıtım hedefleri için, NSShadowbunun yerine şunu kullanmalısınız :

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

görüntü açıklamasını buraya girin


19

Bunu iOS 8+ ve Swift'de yapmak. Bir var setTitleTextAttributesbir görünüm nesne için. Bunun yerine şunu yapın:

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

5

Bunu, AppDelegate.m sınıfına didFinishLaunchingWithOptions yöntemine sadece birkaç satır kod ekleyerek yaptım: Bu kodu kullanın:

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

benim için çalışıyor ...


5

Bunu Swift'de yapmanız gerekiyorsa, bu ayarları almanıza veya ayarlamanıza izin vermek için UINavigationBar için bir uzantı oluşturabilirsiniz.

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

Daha sonra rengi ve yazı tipini şu şekilde ayarlayabilirsiniz:

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

Sanırım bu çözüm, ya titleColorda titleFonttek başına kullanırsanız işe yarar . Bunları birlikte kullanırsanız self.titleTextAttributes, değişkenlerden biri her çağrıldığında yeni bir değere ayarlanacaktır. Ayarlayıcı, yeni sözlüğü oluştururken muhtemelen diğer değeri alabilir.
user023

1

Bu, genel bir ayar yerine tek bir gezinti çubuğuna özel bir görünüm ayarlamak için kullanılabilir

- (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

Bu kod satırını kullanın

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

Bunun size yardımcı olacağını düşünüyorum.


bunu biliyorum, görünüm API'sinin proxy özelliğini kullanmaya çalışıyordum
carbonr
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.