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 CATextLayer
s 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