Изменение текста UILabel, но сохранение остальных атрибутов
У меня есть UILabel в моем ViewController, созданном с использованием раскадровки. Шрифт, размер и цвет текста ярлыка, его выравнивание - все это задано в раскадровке. Метка в раскадровке подключается к выходу в моем файле под названием p_patientNameLbl.
Теперь я пытаюсь изменить текст метки программно, например:
[self.p_patientNameLbl setText:@"Vasya"];
Я не мог видеть новый текст, пока не понял, что исходная метка в раскадровке была белой на черном фоне, но, видимо, после того, как я изменил текст ярлыка, как указано выше, все атрибуты шрифта были reset, и теперь это был черный текст на черном фоне, и поэтому его не видели. После того как я программно задал цвет:
[self.p_patientNameLbl setTextColor:[UIColor whiteColor]];
Я мог видеть новую метку, но все остальные атрибуты шрифта и выравнивание по-прежнему были неправильными.
Есть ли способ изменить только текст метки, не имея при этом программно установить все остальные атрибуты? Я бы предположил, что должен быть способ, так как я не хочу форматировать свой интерфейс в коде!
Ответы
Ответ 1
Это происходит потому, что вы говорите, что построитель интерфейса должен взять метку с заранее определенными атрибутами, установленными в ее тексте, и заменить этот атрибутный текст на простой текст. Вместо 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;
}
Ответ 2
Это работает для меня:
- (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];
Ответ 3
Реализация одной строки в Swift:
label.attributedText = NSAttributedString(string: "text", attributes: label.attributedText!.attributesAtIndex(0, effectiveRange: nil))
Ответ 4
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]];
Ответ 5
Я делал это много раз для нескольких приложений. Я всегда делаю свои ярлыки и текст в Storyboard, изменяя их размер шрифта, цветной дисплей, альфа-значение и т.д. В редакторе. Но потом, если мне нужно изменить текст, который я сделал несколько раз, все, что я делаю, это.
p_patientNameLbl.textColor = [UIColor redColor];
p_patientNameLbl.text = @"My Sample Text";
вот оно. все остальные свойства по умолчанию сохранены. Разве я не пропустил что-то в вашем вопросе?
Ответ 6
Вместо сохранения старых атрибутов и создания новой NSAttributedString с измененным текстом и сохраненными атрибутами, будет относительно простой способ:
NSMutableAttributedString *attStr = [label.attributedText mutableCopy];
NSMutableString *str = attStr.mutableString;
/* change str with new text */
label.attributedText = attStr;