如何使用 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)
【讨论】:
我猜如果您单独使用titleColor
或titleFont
,则此解决方案有效。如果将它们一起使用,则每次调用其中一个变量时,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+ 设置按钮和外观