web-dev-qa-db-fra.com

Changer le texte UILabel mais garder le reste des attributs

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!

13
PeterD

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;
}
8
Mick MacCallum

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];
18
josef

Mise en œuvre sur une ligne dans Swift:

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

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]];
1
Kostas Williams