9

NSAttributedStringをいじっているときに、UITextViewの奇妙な動作に遭遇しました。2つのプロパティがあるとします。

@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>

テキストビューが2つの属性付き文字列の属性を組み合わせているようです。これは驚くべき結果であり、ラベルのように動作することを期待していました。

これはバグだと思います。そうでない場合、UITextViewはattributedTextをUILabelとは異なる方法で処理するのはなぜですか。

(XCodeバージョン4.5.1)

4

2 に答える 2

5

これはバグではないと確信しています。ドキュメントには次のように明確に記載されています。

[テキスト ビューの にattributedText] 新しい値を割り当てると、font、textColor、および textAlignment プロパティの値が更新され、属性付き文字列の位置 0 から始まるスタイル情報が反映されます。

したがって、明示的に設定しないプロパティは、以前の属性付きテキストによって設定されたテキスト ビューの全体的なプロパティから継承されます。

したがって、あなたがやろうとしていることを行う正しい方法は、2 番目の割り当てを行う前に、フォント、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 ベータ 1 で解決されたと述べました。修正済みとして検証されました。

于 2012-11-29T00:04:54.253 に答える