261 votes

Texte gras & Non gras dans un seul UILabel ?

Comment serait-il possible d’inclure du texte en gras et non gras dans un uiLabel ?

J’ai eu plutôt ne pas utiliser un UIWebView... J’ai aussi lu cela peut être possible à l’aide de NSAttributedString, mais je n’ai aucune idée de comment l’utiliser. Toutes les idées ?

Apple réalise cela dans plusieurs de leurs applications ; Capture d’écran des exemples : link text

Merci ! -Dom

365voto

nacho4d Points 12879

Mise à jour pour iOS6:

Dans iOS6 maintenant UILabel, UIButton, UITextView, UITextField, et peut-être d'autres appuient désormais attribuée chaînes qui signifie que nous n'avons pas besoin de créer CATextLayers comme notre bénéficiaire pour attribuable à cordes. En outre de faire de l'attribuée chaîne nous n'avons pas besoin de jouer avec CoreText plus :) Nous avons des nouvelles classes en obj-c de la Fondation.cadre comme NSParagraphStyle et d'autres constantes qui va rendre notre vie plus facile. Yay!!!

Donc, si nous avons cette chaîne:

NSString *text = @"Updated: 2012/10/14 21:59"

Nous avons seulement besoin de créer attribués chaîne:

if ([_label respondsToSelector:@selector(setAttributedText:)])
{
    // iOS6 and above : Use NSAttributedStrings
    const CGFloat fontSize = 13;
    UIFont *boldFont = [UIFont boldSystemFontOfSize:fontSize];
    UIFont *regularFont = [UIFont systemFontOfSize:fontSize];
    UIColor *foregroundColor = [UIColor whiteColor];

    // Create the attributes
    NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:
                                    boldFont, NSFontAttributeName,
                                    foregroundColor, NSForegroundColorAttributeName, nil];
    NSDictionary *subAttrs = [NSDictionary dictionaryWithObjectsAndKeys:
                                    regularFont, NSFontAttributeName, nil];
    const NSRange range = NSMakeRange(8,12); // range of " 2012/10/14 ". Ideally this should not be hardcoded

    // Create the attributed string (text + attributes)
    NSMutableAttributedString *attributedText =
      [[NSMutableAttributedString alloc] initWithString:text
                                             attributes:attrs];
    [attributedText setAttributes:subAttrs range:range];

    // Set it in our UILabel and we are done!
    [_label setAttributedText:attributedText];
} else {
    // iOS5 and below
    // Here we have some options too. The first one is to do something
    // less fancy and show it just as plain text without attributes.
    // The second is to use CoreText and get similar results with a bit
    // more of code. Interested people please look down the old answer.

    // Now I am just being lazy so :p
    [_label setText:text];

}

Il y a un couple de la bonne introduction des posts de blog ici de gars à invasivecode qui expliquent avec davantage d'exemples d'utilisations de l' NSAttributedString, recherchez "Introduction à la NSAttributedString pour iOS 6" et "Attribué chaînes pour iOS en utilisant l'Interface Builder" :)

PS: le code ci-Dessus, il devrait fonctionner, mais il a été cerveau-compilé. J'espère que c'est pas assez :)


Vieille Réponse pour iOS5 et ci-dessous

Utiliser un CATextLayer avec un NSAttributedString ! beaucoup plus léger et plus simple que les 2 UILabels. (iOS 3.2 et au-dessus)

Exemple.

N'oubliez pas d'ajouter QuartzCore cadre (nécessaire pour CALayers), et CoreText (nécessaire pour l'attribuée chaîne).

#import <QuartzCore/QuartzCore.h>
#import <CoreText/CoreText.h>

L'exemple ci-dessous va ajouter une sous-couche à la barre d'outils de la manette de navigation. à la Poste.app sur l'iPhone. :)

- (void)setRefreshDate:(NSDate *)aDate
{
    [aDate retain];
    [refreshDate release];
    refreshDate = aDate;

    if (refreshDate) {

        /* Create the text for the text layer*/    
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"MM/dd/yyyy hh:mm"];

        NSString *dateString = [df stringFromDate:refreshDate];
        NSString *prefix = NSLocalizedString(@"Updated", nil);
        NSString *text = [NSString stringWithFormat:@"%@: %@",prefix, dateString];
        [df release];

        /* Create the text layer on demand */
        if (!_textLayer) {
            _textLayer = [[CATextLayer alloc] init];
            //_textLayer.font = [UIFont boldSystemFontOfSize:13].fontName; // not needed since `string` property will be an NSAttributedString
            _textLayer.backgroundColor = [UIColor clearColor].CGColor;
            _textLayer.wrapped = NO;
            CALayer *layer = self.navigationController.toolbar.layer; //self is a view controller contained by a navigation controller
            _textLayer.frame = CGRectMake((layer.bounds.size.width-180)/2 + 10, (layer.bounds.size.height-30)/2 + 10, 180, 30);
            _textLayer.contentsScale = [[UIScreen mainScreen] scale]; // looks nice in retina displays too :)
            _textLayer.alignmentMode = kCAAlignmentCenter;
            [layer addSublayer:_textLayer];
        }

        /* Create the attributes (for the attributed string) */
        CGFloat fontSize = 13;
        UIFont *boldFont = [UIFont boldSystemFontOfSize:fontSize];
        CTFontRef ctBoldFont = CTFontCreateWithName((CFStringRef)boldFont.fontName, boldFont.pointSize, NULL);
        UIFont *font = [UIFont systemFontOfSize:13];
        CTFontRef ctFont = CTFontCreateWithName((CFStringRef)font.fontName, font.pointSize, NULL);
        CGColorRef cgColor = [UIColor whiteColor].CGColor;
        NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                    (id)ctBoldFont, (id)kCTFontAttributeName,
                                    cgColor, (id)kCTForegroundColorAttributeName, nil];
        CFRelease(ctBoldFont);
        NSDictionary *subAttributes = [NSDictionary dictionaryWithObjectsAndKeys:(id)ctFont, (id)kCTFontAttributeName, nil];
        CFRelease(ctFont);

        /* Create the attributed string (text + attributes) */
        NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:text attributes:attributes];
        [attrStr addAttributes:subAttributes range:NSMakeRange(prefix.length, 12)]; //12 is the length of " MM/dd/yyyy/ "

        /* Set the attributes string in the text layer :) */
        _textLayer.string = attrStr;
        [attrStr release];

        _textLayer.opacity = 1.0;
    } else {
        _textLayer.opacity = 0.0;
        _textLayer.string = nil;
    }
}

Dans cet exemple je n'ai que deux différents types de polices de caractères (gras et normal) mais vous pourriez aussi avoir différentes taille de police, couleur, italique, souligné, etc. Jetez un oeil à NSAttributedString / NSMutableAttributedString et CoreText attributs clés de chaîne.

J'espère que ça aide

85voto

bbrame Points 2643

Essayez une catégorie sur UILabel :

Voici comment il est utilisé :

Et voici la catégorie

UILabel+Boldify.h

UILabel+Boldify.m

Notez que cela ne fonctionnera que dans iOS 6 et versions ultérieures. Il sera tout simplement ignoré dans l’iOS 5 et versions antérieures.

52voto

Anton Gaenko Points 331

C'est facile à faire dans Interface Builder:

1) faire UILabel Attribuée dans les Attributs de l'Inspecteur de

Bold Example Step 1

2) sélectionnez la partie de la phrase que vous voulez faire de gras

Bold Example Step 2

3) changez la police (ou de gras de la même police) dans le sélecteur de polices

Bold Example Step 3

C'est tout!

46voto

Crazy Yoghurt Points 985

Il y a des catégories selon catégorie de bbrame. Il fonctionne de la même, mais permet de vous boldify même `` plusieurs fois avec des résultats cumulatifs.

UILabel+Boldify.h

UILabel+Boldify.m

Avec cette correction vous pouvez l’utiliser plusieurs fois, par exemple :

se traduira par : "mise à jour : 2012/10/14 21:59«.

21voto

mattt Points 10419

Consultez TTTAttributedLabel. C’est un remplacement pour UILabel qui vous permet d’avoir mélangé polices et couleurs dans un label unique en définissant un NSAttributedString comme le texte de cette étiquette.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X