13

我在使用情节提要创建的 ViewController 中有一个 UILabel。标签文本的字体、大小和颜色,对齐方式 - 都在情节提要中设置。故事板中的标签连接到我名为p_patientNameLbl的文件中的插座。

现在我正在尝试以编程方式更改标签的文本,如下所示:

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

我看不到新文本,直到我意识到情节提要中的原始标签是黑色背景上的白色,但显然在我如上所述更改标签的文本后,所有字体属性都已重置,现在它是黑​​色文本黑色背景,因此看不到。一旦我以编程方式设置颜色:

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

我可以看到新标签,但所有其余的字体属性和对齐方式仍然是错误的。

有没有办法更改标签的文本,而无需以编程方式设置所有其余属性?我想一定有办法,因为我不想在代码中格式化我的界面!

4

7 回答 7

18

这对我有用:

- (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];
于 2013-06-16T19:12:16.817 回答
10

发生这种情况是因为您告诉 Interface builder 采用在其文本上设置了预定义属性的标签并将此属性文本替换为纯文本。而不是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;
}
于 2013-01-23T20:14:56.907 回答
10

Swift 中的一行实现:

label.attributedText = NSAttributedString(string: "text", attributes: label.attributedText!.attributesAtIndex(0, effectiveRange: nil))
于 2016-06-20T07:29:08.503 回答
3

斯威夫特 4

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

(Bartłomiej Semańczyk 回答的一些未成年人变化)

于 2019-06-03T05:17:27.370 回答
1

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]];
于 2013-06-20T13:06:51.070 回答
-1

我已经为多个应用程序做了很多次。我总是在 Storyboard 中制作标签和文本,在编辑器中更改它们的字体大小、颜色显示、alpha 值等。但是之后如果我需要更改我已经多次完成的文本,我所做的就是这个。

p_patientNameLbl.textColor = [UIColor redColor];
p_patientNameLbl.text = @"My Sample Text";

而已。保留所有其他默认属性。除非我错过了你的问题?

于 2013-01-23T20:11:06.240 回答
-1

除了存储旧属性并使用更改的文本和存储的属性创建新的 NSAttributedString 之外,一种相对更简单的方法是:

NSMutableAttributedString *attStr = [label.attributedText mutableCopy];
NSMutableString *str = attStr.mutableString;
/* change str with new text */
label.attributedText = attStr;
于 2015-10-27T11:15:43.607 回答