9

在玩 NSAttributedString 时,我遇到了 UITextView 的一些奇怪行为。假设我有两个属性:

@property (weak, nonatomic) IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UITextView *textView;

在这些属性的拥有控制器中,我有以下代码:

NSDictionary *attributes = @{NSFontAttributeName : [UIFont systemFontOfSize:20.],
                            NSForegroundColorAttributeName: [UIColor redColor]};
NSAttributedString *as = [[NSAttributedString alloc] initWithString:@"Hello there!" attributes:attributes];


NSMutableAttributedString *mas = [[NSMutableAttributedString alloc] initWithString:@"Hello where?" attributes:nil];
[mas addAttribute:NSForegroundColorAttributeName value:[UIColor yellowColor] range:NSMakeRange(3, 5)];

self.label.attributedText = as;
self.label.attributedText = mas;


self.textView.attributedText = as;
self.textView.attributedText = mas;

在模拟器中运行时,标签看起来(呃,发挥你的想象力)如下,使用系统默认字体:

<black>Hel</black><yellow>lo wh</yellow><black>ere?</black>

文本视图如下所示,使用大小为 20.0 的系统字体:

<red>Hel</red><yellow>lo wh</yellow><red>ere?</red>

似乎文本视图正在组合来自两个属性字符串的属性。我发现这是一个令人惊讶的结果,并希望它表现得像标签一样。

我怀疑这是一个错误。如果不是,那么 UITextView 如何以及为什么以与 UILabel 不同的方式对待属性文本?

(XCode 版本 4.5.1)

4

2 回答 2

5

我很确定这不是错误。该文件明确指出:

分配一个新的值 [给文本视图的attributedText] 会更新 font、textColor 和 textAlignment 属性中的值,以便它们反映属性字符串中从位置 0 开始的样式信息。

因此,您未明确设置的任何属性都将从文本视图的整体属性继承,这些属性由先前的属性文本设置。

因此,正确的做法是在进行第二次分配之前重置字体、textColor 和 textAlignment:

self.tv.attributedText = as;
// reset everything
self.tv.text = nil;
self.tv.font = nil;
self.tv.textColor = nil;
self.tv.textAlignment = NSTextAlignmentLeft;
// and now... lo and behold ...
self.tv.attributedText = mas;
于 2012-11-29T00:20:33.870 回答
4

我向 Apple 提交了错误报告。他们回来说,iOS 7 beta 1 解决了这个问题。验证为已修复。

于 2012-11-29T00:04:54.253 回答