如何使用iOS5外观API在UINavigationBar中设置标题的字体和颜色?
我有一个多视图控制器,我想设置所有的字体颜色为红色。
[[UINavigationBar appearance] setFont:[UIFont boldSystemFontOfSize:12.0]];
抛出一个无法识别的select器错误。
请给出一个代码,以帮助解决以下问题。
来自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]];
或者,如果您喜欢使用对象字面风格:
[[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] }];
对于大于或等于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];
在iOS 8+和Swift上执行此操作。 外观对象没有setTitleTextAttributes
。 相反,这样做:
UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : AppTheme.fontWithSize(18)]
我通过在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];
这个对我有用…
如果您需要在Swift中执行此操作,则可以为UINavigationBar创build一个扩展,以允许您获取或设置这些设置。
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)
这可以用于将自定义视图设置为单个导航栏而不是全局设置
- (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; }
使用这一行代码
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];
我想这会对你有所帮助。