Как установить шрифт и цвет заголовка в UINavigationBar с помощью API внешнего вида iOS5?

90

У меня есть несколько контроллеров представления, и я хочу установить для всех красный цвет шрифта.

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

выдает нераспознанную ошибку селектора.

Как я могу это исправить?

карбон
источник
Затем Вы должны установить метку и просмотреть на панели навигации и установить цвет шрифта
vishiphone

Ответы:

207

От Рэя Вендерлиха:

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

Или, если вы предпочитаете стиль литерала объекта:

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

Редактировать для iOS 7 и последующих версий

Атрибуты UITextAttribute устарели, поскольку в iOS 7 вы можете использовать следующее:

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]
     }];
TigerCoding
источник
1
Более часа я боролся с той частью кода из учебника, которая приводит к обрезке заголовка моего элемента навигации после первого нажатия ... Будьте осторожны с размером шрифта, что было проблемой в моей ситуации ... Очевидно, размер 0.0 у меня не сработало ...
Bartu
3
новый словарный литерал сделает его намного красивее
tybro0103
В качестве примечания, это только 5.0+, если вы поддерживаете 4, тогда это стоит сделать в if ([navBarInstance respondsToSelector:@selector(appearance)])первую очередь, потому что это приведет к сбою версий iOS ниже 5.
Адам Уэйт
1
Неправильное имя шрифта приводит к сбою приложения. Попробуйте что-нибудь вроде Arial-BoldMT.
MacMark
17
TIL UITextAttributeTextColorустарел и заменен NSForegroundColorAttributeNameна iOS 7
Бренден
23

Для целей развертывания выше или равных iOS 6 вы должны использовать 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];

введите описание изображения здесь

Роберт
источник
19

Делаем это на iOS 8+ и в Swift. Не существует setTitleTextAttributesобъекта внешнего вида. Вместо этого сделайте следующее:

UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : AppTheme.fontWithSize(18)]
MLQ
источник
5

Я сделал это, добавив всего несколько строк кода в методе класса AppDelegate.m didFinishLaunchingWithOptions: Используйте этот код:

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

меня устраивает...

Майши Вадхвани
источник
5

Если вам нужно сделать это в Swift, вы можете создать расширение для UINavigationBar, которое позволит вам получать или устанавливать эти параметры.

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

Затем вы можете установить цвет и шрифт следующим образом:

navigationBar.titleColor = UIColor.redColor()
navigationBar.titleFont = UIFont.systemFontOfSize(12)
ТОТИГ
источник
Я предполагаю, что это решение работает, если вы используете его titleColorили по titleFontотдельности. Если вы используете их вместе, self.titleTextAttributesкаждый раз при вызове одной из переменных будет устанавливаться новое значение. Установщик, вероятно, сможет получить другое значение при создании нового словаря.
user023
1

Это можно было бы использовать для установки настраиваемого представления на одну панель навигации вместо глобального параметра

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

Используйте эту строку кода

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

Думаю, это будет вам полезно.

вишифон
источник
Я знаю это, я пытался использовать прокси-функцию внешнего интерфейса
carbonr