iOS 7中UIBarButtonItem被点击时字体发生变化。

9

我试图改变我的UIBarButtonItem字体。当视图控制器加载时,它看起来很好。但是如果我点击工具栏按钮,或者向右滑动以移动到上一个视图控制器(但然后拉回到当前控制器),字体会改回系统字体。这是我在AppDelegate中设置的:

NSDictionary* barButtonItemAttributes = @{NSFontAttributeName: [UIFont fontWithName:@"SourceSansPro-Light" size:20.0f]};
[[UIBarButtonItem appearance] setTitleTextAttributes: barButtonItemAttributes forState:UIControlStateNormal];
[[UIBarButtonItem appearance] setTitleTextAttributes: barButtonItemAttributes forState:UIControlStateHighlighted];
[[UIBarButtonItem appearance] setTitleTextAttributes: barButtonItemAttributes forState:UIControlStateSelected];
[[UIBarButtonItem appearance] setTitleTextAttributes: barButtonItemAttributes forState:UIControlStateDisabled];

这里是我的viewWillAppear示例:

- (void) viewWillAppear:(BOOL)animated {
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(doneButtonPressed)];
    self.navigationItem.rightBarButtonItem.tintColor = [UIColor colorWithRed:141.0/255.0 green:209.0/255.0 blue:205.0/255.0 alpha:1.0];
}

我是否在某种程度上将字体改回来了,还是我误用了外观代理?

3个回答

15
问题在于 tintColor 设置与标题文本属性发生冲突。将该行注释掉,一切都会好起来。
如果您要使用标题文本属性,请将文本颜色纳入这些属性中:
NSDictionary* barButtonItemAttributes =
@{NSFontAttributeName:
      [UIFont fontWithName:@"Georgia" size:20.0f],
  NSForegroundColorAttributeName:
      [UIColor colorWithRed:141.0/255.0 green:209.0/255.0 blue:205.0/255.0 alpha:1.0]  
 };

谢谢。那似乎是正确的。但是我如何在每个视图控制器上更改按钮颜色? - hodgesmr
在iOS 7中,NSAttributedString是一种一流的对象,因此颜色现在是文本属性。因此,不要使用外观代理并与单个“tintColor”冲突,只需制作按钮并赋予其所需的文本属性,包括字体和颜色。 - matt
1
现在,说了这么多,事实上你遇到了一个巨大的iOS 7 bug。在Stack Overflow上进行一些搜索将会发现许多人遇到了类似的问题,例如这里:https://dev59.com/YnfZa4cB1Zd3GeqPNhwy?rq=1 基本上,你应该尝试将这个bug缩小到一个简单的可演示的情况,然后向苹果报告它。 - matt
感谢您的反馈。我在想当我在ViewController中手动“覆盖”titleTextAttributes时,是否可以查询外观代理并使用从AppDelegate中已经存储的内容? - hodgesmr
1
如果问题在于您不想为每个条形按钮项显式设置文本属性,而是不同的条形按钮项具有不同的颜色,为什么不使用外观代理的“包含”版本来为不同的视图控制器提前设置不同的属性呢? - matt
@Matt:谢谢你的建议!我在 Stack Overflow 上找了一段时间,但只有你的建议起作用了! - Pangu

3
在viewDidLoad方法中使用这种方法,您可以将自定义文本、字体、大小等全部设置在一个地方。
UIView *customBarButtonView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 50, 30)];

UIButton *buttonDone = [UIButton buttonWithType:UIButtonTypeSystem];
[buttonDone addTarget:self action:@selector(doneButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

buttonDone.frame = CGRectMake(10, 0, 50, 30);

buttonDone.titleLabel.textColor = [UIColor colorWithRed:141.0/255.0 green:209.0/255.0 blue:205.0/255.0 alpha:1.0];
buttonDone.titleLabel.font = [UIFont fontWithName:@"SourceSansPro-Light" size:20.0f];
[buttonDone setTitle:@"Done" forState:UIControlStateNormal];
[customBarButtonView addSubview:buttonDone];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:customBarButtonView];

2
_myrButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"French KeyBoard" style:UIBarButtonItemStylePlain target:self action:@selector(RbuttonItemdown:)];

NSDictionary* itemTextAttributes = @{NSFontAttributeName:[UIFont fontWithName:@"Georgia" size:12.0f], NSForegroundColorAttributeName:[UIColor blueColor], NSBackgroundColorAttributeName:[UIColor lightGrayColor]};

[_myrButtonItem setTitleTextAttributes:itemTextAttributes forState:UIControlStateNormal];

[self.navigationItem setRightBarButtonItem:_myrButtonItem];

您可以使用以下所有内容:
NSString *const  NSFontAttributeName ;
NSString *const  NSParagraphStyleAttributeName ;
NSString *const  NSForegroundColorAttributeName ;
NSString *const  NSBackgroundColorAttributeName ;
NSString *const  NSLigatureAttributeName ;
NSString *const  NSKernAttributeName ;
NSString *const  NSStrikethroughStyleAttributeName ;
NSString *const  NSUnderlineStyleAttributeName ;
NSString *const  NSStrokeColorAttributeName ;
NSString *const  NSStrokeWidthAttributeName ;
NSString *const  NSShadowAttributeName ;
NSString *const  NSTextEffectAttributeName ;
NSString *const  NSAttachmentAttributeName ;
NSString *const  NSLinkAttributeName ;
NSString *const  NSBaselineOffsetAttributeName ;
NSString *const  NSUnderlineColorAttributeName ;
NSString *const  NSStrikethroughColorAttributeName ;
NSString *const  NSObliquenessAttributeName ;
NSString *const  NSExpansionAttributeName ;
NSString *const  NSWritingDirectionAttributeName ;
NSString *const  NSVerticalGlyphFormAttributeName;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接