J'ai un UILabel dans mon ViewController créé à l'aide de storyboards. La police, la taille et la couleur du texte de l'étiquette, son alignement - tout est défini dans le storyboard. L’étiquette du storyboard est connectée à la sortie de mon fichier appelée p_patientNameLbl.
Maintenant, j'essaye de changer le texte de l'étiquette par programmation, comme ceci:
[self.p_patientNameLbl setText:@"Vasya"];
Je ne pouvais pas voir le nouveau texte, jusqu'à ce que je réalise que l'étiquette d'origine dans le storyboard était blanche sur fond noir, mais apparemment, après avoir modifié le texte de l'étiquette comme ci-dessus, tous les attributs de police ont été réinitialisés et le texte était noir. fond noir, et donc pas vu. Une fois que j'ai défini la couleur par programme:
[self.p_patientNameLbl setTextColor:[UIColor whiteColor]];
Je pouvais voir la nouvelle étiquette, mais tous les autres attributs et alignements de la police étaient toujours faux.
Y a-t-il un moyen de changer seulement le texte de l'étiquette sans avoir ensuite à programmer tous les autres attributs? J'imagine qu'il doit y avoir un moyen, car je ne veux pas formater mon interface dans le code!
Ceci est dû au fait que vous indiquez à Interface Builder de prendre une étiquette comportant des attributs prédéfinis sur son texte et de remplacer ce texte attribué par du texte brut. Au lieu de setText
ou setTextColor
, vous devez utiliser setAttributedText
et spécifier les attributs que vous souhaitez transmettre à la chaîne attribuée.
Voici un exemple d’application par programme d’une chaîne attribuée à votre étiquette. Je ne connais pas de meilleure solution, mais vous pouvez y apporter des modifications. Si vous définissez vos autres attributs avec eux, tous les changements seront appliqués correctement.
[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;
}
Cela fonctionne pour moi:
- (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];
Mise en œuvre sur une ligne dans Swift:
label.attributedText = NSAttributedString(string: "text", attributes: label.attributedText!.attributesAtIndex(0, effectiveRange: nil))
0x7fffffff, merci pour votre conseil, cela a fonctionné pour moi. Dans iOS6, certains autres conseils ne fonctionnaient pas, par exemple. extraire les attributs et les réappliquer.
Dans mon cas, je perdais pas mal d’attributs utiles, y compris la police, alors voici ma solution:
- (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;
}
puis appliquez-le à UILabel comme ceci:
[self.myLabel setAttributedText:[self CurrentSetLabelAttributes:[NSString stringWithFormat:@"%d", myClass.text] col:[UIColor redColor] size:50.0f]];