web-dev-qa-db-ja.com

UILabelテキストを変更しますが、残りの属性は保持します

ストーリーボードを使用して作成されたViewControllerにUILabelがあります。ラベルのテキストのフォント、サイズ、色、配置-すべてストーリーボードで設定されます。ストーリーボードのラベルは、私のファイルのアウトレットに接続されています。 p_patientNameLbl

今、私は次のようにプログラムでラベルのテキストを変更しようとしています:

[self.p_patientNameLbl setText:@"Vasya"];

ストーリーボードの元のラベルが黒の背景に白であることに気付くまで、新しいテキストを見ることができませんでしたが、上記のようにラベルのテキストを変更した後、すべてのフォント属性がリセットされ、黒のテキストになりました。背景が黒いため、表示されません。プログラムで色を設定したら:

[self.p_patientNameLbl setTextColor:[UIColor whiteColor]];

新しいラベルは表示されましたが、残りのフォント属性と配置はすべて間違っていました。

変更する方法はありますか のみ 残りのすべての属性をプログラムで設定しなくても、ラベルのテキストは?コードでインターフェイスをフォーマットしたくないので、方法があるはずだと思います。

13
PeterD

これは、インターフェイスビルダーに、テキストに事前定義された属性が設定されているラベルを取得し、この属性付きテキストをプレーンテキストに置き換えるように指示しているために発生しています。 setTextまたはsetTextColorの代わりに、setAttributedTextを使用して、属性付き文字列に渡す属性を指定する必要があります。

これは、属性付き文字列をプログラムでラベルに適用する方法の例です。これ以上の方法はわかりませんが、これを使用すると、テキストまたはテキストの色を変更できます。他の属性を一緒に設定する限り、すべての変更が正しく適用されます。

[myLabel setAttributedText:[self myLabelAttributes:@"Some awesome text!"]];

....................

- (NSMutableAttributedString *)myLabelAttributes:(NSString *)input
{
    NSMutableAttributedString *labelAttributes = [[NSMutableAttributedString alloc] initWithString:input];

    [labelAttributes addAttribute:NSStrokeWidthAttributeName value:[NSNumber numberWithFloat:-5.0] range:NSMakeRange(0, labelAttributes.length)];
    [labelAttributes addAttribute:NSStrokeColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, labelAttributes.length)];
    [labelAttributes addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, labelAttributes.length)];

    return labelAttributes;
}
9
Mick MacCallum

これは私のために働きます:

- (void)setText:(NSString *)text withExistingAttributesInLabel:(UILabel *)label {

    // Check label has existing text
    if ([label.attributedText length]) {

        // Extract attributes
        NSDictionary *attributes = [(NSAttributedString *)label.attributedText attributesAtIndex:0 effectiveRange:NULL];

        // Set new text with extracted attributes
        label.attributedText = [[NSAttributedString alloc] initWithString:text attributes:attributes];

    }

}

...

[self setText:@"Some text" withExistingAttributesInLabel:self.aLabel];
18
josef

Swiftでの1行の実装:

label.attributedText = NSAttributedString(string: "text", attributes: label.attributedText!.attributesAtIndex(0, effectiveRange: nil))

Swift 4

label.attributedText = NSAttributedString(string: "new label text", attributes: label.attributedText!.attributes(at: 0, effectiveRange: nil))

(BartłomiejSemańczykの回答からいくつかのマイナーな変更)

3
Oz Shabat

0x7fffffff、あなたのヒントに感謝します、それは私のために働きました。 iOS6では、ここでの他のいくつかのアドバイスは機能しませんでした。属性を抽出して再適用します。

私の場合、フォントを含むかなりの数の有用な属性を失っていたので、これが私の解決策です:

- (NSMutableAttributedString *)SetLabelAttributes:(NSString *)input col:(UIColor *)col size:(Size)size {

NSMutableAttributedString *labelAttributes = [[NSMutableAttributedString alloc] initWithString:input];

UIFont *font=[UIFont fontWithName:@"Helvetica Neue" size:size];

NSMutableParagraphStyle* style = [NSMutableParagraphStyle new];
style.alignment = NSTextAlignmentCenter;

[labelAttributes addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, labelAttributes.length)];
[labelAttributes addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, labelAttributes.length)];
[labelAttributes addAttribute:NSForegroundColorAttributeName value:col range:NSMakeRange(0, labelAttributes.length)];

return labelAttributes;
}

次に、次のようにUILabelに適用します。

[self.myLabel setAttributedText:[self CurrentSetLabelAttributes:[NSString stringWithFormat:@"%d", myClass.text] col:[UIColor redColor]  size:50.0f]];
1
Kostas Williams