如何使用 iOS5 外观 API 在 UINavigationBar 中设置标题的字体和颜色?

Posted

技术标签:

【中文标题】如何使用 iOS5 外观 API 在 UINavigationBar 中设置标题的字体和颜色?【英文标题】:How to set font & color of the title in UINavigationBar using iOS5 appearance API? 【发布时间】:2012-05-12 21:42:08 【问题描述】:

我有多个视图控制器,我想将所有的字体颜色设置为红色。

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

正在引发无法识别的选择器错误。

我该如何解决这个问题?

【问题讨论】:

那么你应该在导航栏上设置标签和视图并设置字体颜色 【参考方案1】:

如果您需要在 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)

【讨论】:

我猜如果您单独使用titleColortitleFont,则此解决方案有效。如果将它们一起使用,则每次调用其中一个变量时,self.titleTextAttributes 将被设置为一个新值。 setter 在创建新字典时可能会获取其他值。【参考方案2】:

这可用于将自定义视图设置为单个导航栏而不是全局设置

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

【讨论】:

【参考方案3】:

来自雷·温德利希:

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 及以下版本编辑

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

【讨论】:

1 个多小时以来,我一直在努力处理教程中的那部分代码,这会导致在第一次推送后裁剪我的导航项的标题...注意字体大小,这是问题所在在我的情况下......显然尺寸 0.0 对我不起作用...... 新的字典文字会让这个更漂亮 顺便说一句,这只是 5.0+,如果你支持 4,那么值得先做if ([navBarInstance respondsToSelector:@selector(appearance)]),因为它会导致低于 5 的 iOS 版本崩溃。 字体名称错误导致应用崩溃。试试 Arial-BoldMT 之类的东西。 TIL UITextAttributeTextColor 在 iOS 7 中被 NSForegroundColorAttributeName 取代【参考方案4】:

在 iOS 8+ 和 Swift 中执行此操作。外观对象没有setTitleTextAttributes。而是这样做:

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

【讨论】:

【参考方案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];

它对我有用...

【讨论】:

【参考方案6】:

对于大于或等于 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];

【讨论】:

【参考方案7】:

使用这行代码

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

我认为这对你会有帮助。

【讨论】:

我知道,我正在尝试使用外观 API 的代理功能

以上是关于如何使用 iOS5 外观 API 在 UINavigationBar 中设置标题的字体和颜色?的主要内容,如果未能解决你的问题,请参考以下文章

UIBarButtonItemStyleDone 使用 iOS 5 外观 API 的背景图片

如何使用 iOS 5 实现“查找我的朋友”按钮外观?就好像纽扣被压在了皮革上

PayPal API:如何将其集成到我的应用程序中? IOS5

为所有导航栏 (UINavigationBar) iOS 5.1+ 设置按钮和外观

UITabBar 外观适用于 iOS6 但不适用于 iOS 5

使用 Window API,如何确保控件保持原生外观?