iPhone – UILabel contenant du texte avec plusieurs fonts en même temps

Je cherche un moyen d’utiliser un UILabel (ou quelque chose de similaire) pour afficher quelque chose comme ceci:

Tom: Un message.

C’est comme ça, par exemple, dans l’application Facebook d’afficher “Que pensez-vous?” messages. Quelqu’un at-il des suggestions sur la façon d’aborder cette question?

Utilisez deux UOlabel IBOutlets, chacun avec un format différent (police / couleur / etc), selon vos désirs. Déplacez le second sur le premier en fonction de la fin du texte du premier. Vous pouvez obtenir cela via sizeWithFont: forWidth: lineBreakMode:

Vous pouvez également sous-classer UILabel et dessiner le texte vous-même dans drawRect. Si vous le faites de cette façon, ajoutez simplement une variable d’instance pour vous indiquer la quantité de chaîne à dessiner dans un format et dessinez le rest dans une autre.

Mise à jour: S’il vous plaît voir la réponse de @ Akshay ci-dessous. À partir d’iOS6, UILabel peut contenir NSMutableAtsortingbutedSsortingng. Quand j’ai écrit ceci, ce n’était pas disponible.

Il existe un moyen de définir différentes / multiples fonts et autres propriétés sur Label à l’aide de NSMutableAtsortingbutedSsortingng. Foll est mon code:

UIFont *arialFont = [UIFont fontWithName:@"arial" size:18.0]; NSDictionary *arialDict = [NSDictionary dictionaryWithObject: arialFont forKey:NSFontAtsortingbuteName]; NSMutableAtsortingbutedSsortingng *aAttrSsortingng = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:title atsortingbutes: arialDict]; UIFont *VerdanaFont = [UIFont fontWithName:@"verdana" size:12.0]; NSDictionary *verdanaDict = [NSDictionary dictionaryWithObject:VerdanaFont forKey:NSFontAtsortingbuteName]; NSMutableAtsortingbutedSsortingng *vAttrSsortingng = [[NSMutableAtsortingbutedSsortingng alloc]initWithSsortingng: newsDate atsortingbutes:verdanaDict]; [vAttrSsortingng addAtsortingbute:NSForegroundColorAtsortingbuteName value:[UIColor blackColor] range:(NSMakeRange(0, 15))]; [aAttrSsortingng appendAtsortingbutedSsortingng:vAttrSsortingng]; lblText.atsortingbutedText = aAttrSsortingng; 

Notez que lblText est le UILabel, sortie en tant que propriétaire du fichier. On peut continuer à append autant de NSMutableAtsortingbutedSsortingng qu’il le souhaite.

Notez également que j’ai ajouté des fonts verdana et arial dans mon projet et ajouté un plist pour la même chose.

Désolé de la réponse tardive. Le code ci-dessous fonctionne très bien pour moi. Je poste ceci pour que cela puisse être utile à quelqu’un.

  UIFont *font1 = [UIFont fontWithName:kMyriadProSemiBold size:15]; NSDictionary *arialDict = [NSDictionary dictionaryWithObject: font1 forKey:NSFontAtsortingbuteName]; NSMutableAtsortingbutedSsortingng *aAttrSsortingng1 = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:@"My" atsortingbutes: arialDict]; UIFont *font2 = [UIFont fontWithName:kMyriadProRegular size:15]; NSDictionary *arialDict2 = [NSDictionary dictionaryWithObject: font2 forKey:NSFontAtsortingbuteName]; NSMutableAtsortingbutedSsortingng *aAttrSsortingng2 = [[NSMutableAtsortingbutedSsortingng alloc] initWithSsortingng:@"Profile" atsortingbutes: arialDict2]; [aAttrSsortingng1 appendAtsortingbutedSsortingng:aAttrSsortingng2]; myProfileLabel.atsortingbutedText = aAttrSsortingng1; 

entrer la description de l'image ici

Veuillez noter que My est semi-gras et que le profil est régulier. J’ai utilisé la police MyRiad. Merci

Mise à jour: Si vous êtes iOS 6+, utilisez UILabel.atsortingbutedText – sinon ….

J’ai créé cette sous-classe de base UIView pour prendre en charge des fonctionnalités similaires.

La liste des éléments qu’elle ne prend pas en charge est plus longue que ce qu’elle fait, mais elle vous permet en fait de gérer une seule ligne d’UBILabels et de les formater comme vous le souhaitez. Cela me permet, par exemple, d’intercaler du texte avec une couleur différente au milieu de la ligne et d’éviter d’utiliser le poids lourd UIWebView.

Je crée ces objects en plaçant un object UIView dans mon interface (à l’aide d’Interface Builder) et en définissant le type d’object dans IB sur MultipartLabel. Ensuite, dans le code, j’appelle updateNumberOfLabels et les différents sélecteurs setText, selon les besoins.

 // MultipartLabel.m // MultiLabelLabel // // Created by Jason Miller on 10/7/09. // Copyright 2009 Jason Miller. All rights reserved. // #import "MultipartLabel.h" @interface MultipartLabel (Private) - (void)updateLayout; @end @implementation MultipartLabel @synthesize containerView; @synthesize labels; -(void)updateNumberOfLabels:(int)numLabels; { [containerView removeFromSuperview]; self.containerView = nil; self.containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)] autorelease]; [self addSubview:self.containerView]; self.labels = [NSMutableArray array]; while (numLabels-- > 0) { UILabel * label = [[UILabel alloc] initWithFrame:CGRectZero]; [self.containerView addSubview:label]; [self.labels addObject:label]; [label release]; } [self updateLayout]; } -(void)setText:(NSSsortingng *)text forLabel:(int)labelNum; { if( [self.labels count] > labelNum && labelNum >= 0 ) { UILabel * thisLabel = [self.labels objectAtIndex:labelNum]; thisLabel.text = text; } [self updateLayout]; } -(void)setText:(NSSsortingng *)text andFont:(UIFont*)font forLabel:(int)labelNum; { if( [self.labels count] > labelNum && labelNum >= 0 ) { UILabel * thisLabel = [self.labels objectAtIndex:labelNum]; thisLabel.text = text; thisLabel.font = font; } [self updateLayout]; } -(void)setText:(NSSsortingng *)text andColor:(UIColor*)color forLabel:(int)labelNum; { if( [self.labels count] > labelNum && labelNum >= 0 ) { UILabel * thisLabel = [self.labels objectAtIndex:labelNum]; thisLabel.text = text; thisLabel.textColor = color; } [self updateLayout]; } -(void)setText:(NSSsortingng *)text andFont:(UIFont*)font andColor:(UIColor*)color forLabel:(int)labelNum; { if( [self.labels count] > labelNum && labelNum >= 0 ) { UILabel * thisLabel = [self.labels objectAtIndex:labelNum]; thisLabel.text = text; thisLabel.font = font; thisLabel.textColor = color; } [self updateLayout]; } - (void)updateLayout { int thisX = 0; // TODO when it is time to support different sized fonts, need to adjust each y value to line up baselines for (UILabel * thisLabel in self.labels) { CGSize size = [thisLabel.text sizeWithFont:thisLabel.font constrainedToSize:CGSizeMake(9999, 9999) lineBreakMode:thisLabel.lineBreakMode]; CGRect thisFrame = CGRectMake( thisX, 0, size.width, size.height ); thisLabel.frame = thisFrame; thisX += size.width; } } - (void)dealloc { [labels release]; labels = nil; [containerView release]; containerView = nil; [super dealloc]; } @end 

Dans swift 2.0, cela peut se faire comme suit

 //Defining fonts of size and type let firstfont:UIFont = UIFont(name: "Helvetica Neue", size: 17)! let boldFont:UIFont = UIFont(name: "HelveticaNeue-Bold", size: 17)! let thirdFont:UIFont = UIFont(name: "HelveticaNeue-ThinItalic", size: 17)! //Making dictionaries of fonts that will be passed as an atsortingbute let firstDict:NSDictionary = NSDictionary(object: firstfont, forKey: NSFontAtsortingbuteName) let boldDict:NSDictionary = NSDictionary(object: boldFont, forKey: NSFontAtsortingbuteName) let thirdDict:NSDictionary = NSDictionary(object: thirdFont, forKey: NSFontAtsortingbuteName) let firstText = "My name is " let atsortingbutedSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: firstText, atsortingbutes: firstDict as? [Ssortingng : AnyObject]) let boldText = "Rajan" let boldSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng:boldText, atsortingbutes:boldDict as? [Ssortingng : AnyObject]) let finalText = " iOS" let finalAtsortingbutedSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: finalText, atsortingbutes: thirdDict as? [Ssortingng : AnyObject]) atsortingbutedSsortingng.appendAtsortingbutedSsortingng(boldSsortingng) atsortingbutedSsortingng.appendAtsortingbutedSsortingng(finalAtsortingbutedSsortingng) myLabel.atsortingbutedText = atsortingbutedSsortingng 

modifier
Swift 3.0

 let firstfont:UIFont = UIFont(name: "Helvetica Neue", size: 17)! let boldFont:UIFont = UIFont(name: "HelveticaNeue-Bold", size: 17)! let thirdFont:UIFont = UIFont(name: "HelveticaNeue-ThinItalic", size: 17)! //Making dictionaries of fonts that will be passed as an atsortingbute let firstDict:NSDictionary = NSDictionary(object: firstfont, forKey: NSFontAtsortingbuteName as NSCopying) let boldDict:NSDictionary = NSDictionary(object: boldFont, forKey: NSFontAtsortingbuteName as NSCopying) let thirdDict:NSDictionary = NSDictionary(object: thirdFont, forKey: NSFontAtsortingbuteName as NSCopying) let firstText = "My name is " let atsortingbutedSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: firstText, atsortingbutes: firstDict as? [Ssortingng : AnyObject]) let boldText = "Rajan" let boldSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng:boldText, atsortingbutes:boldDict as? [Ssortingng : AnyObject]) let finalText = " iOS" let finalAtsortingbutedSsortingng = NSMutableAtsortingbutedSsortingng(ssortingng: finalText, atsortingbutes: thirdDict as? [Ssortingng : AnyObject]) atsortingbutedSsortingng.append(boldSsortingng) atsortingbutedSsortingng.append(finalAtsortingbutedSsortingng) myLabel.atsortingbutedText = atsortingbutedSsortingng 

Cela ressemblera à

entrer la description de l'image ici

J’ai mis à jour MultipartLabel suggéré par @Jason en ajoutant la prise en charge de contentMode (alignement de texte).

MultipartLabel.h

 #import  @interface MultipartLabel : UIView { } @property (nonatomic,retain) UIView *containerView; @property (nonatomic,retain) NSMutableArray *labels; @property (nonatomic) UIViewContentMode contentMode; - (void)updateNumberOfLabels:(int)numLabels; - (void)setText:(NSSsortingng *)text forLabel:(int)labelNum; - (void)setText:(NSSsortingng *)text andFont:(UIFont*)font forLabel:(int)labelNum; - (void)setText:(NSSsortingng *)text andColor:(UIColor*)color forLabel:(int)labelNum; - (void)setText:(NSSsortingng *)text andFont:(UIFont*)font andColor:(UIColor*)color forLabel:(int)labelNum; @end 

MultipartLabel.m

 // MultipartLabel.m // MultipartLabel // // Created by Jason Miller on 10/7/09. // Updated by Laurynas Butkus, 2011 // Copyright 2009 Jason Miller. All rights reserved. // #import "MultipartLabel.h" @interface MultipartLabel (Private) - (void)updateLayout; @end @implementation MultipartLabel @synthesize containerView; @synthesize labels; @synthesize contentMode; -(void)updateNumberOfLabels:(int)numLabels { [containerView removeFromSuperview]; self.containerView = nil; self.containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)] autorelease]; [self addSubview:self.containerView]; self.labels = [NSMutableArray array]; while (numLabels-- > 0) { UILabel * label = [[UILabel alloc] initWithFrame:CGRectZero]; label.backgroundColor = self.backgroundColor; [self.containerView addSubview:label]; [self.labels addObject:label]; [label release]; } [self updateLayout]; } -(void)setText:(NSSsortingng *)text forLabel:(int)labelNum { if( [self.labels count] > labelNum && labelNum >= 0 ) { UILabel * thisLabel = [self.labels objectAtIndex:labelNum]; thisLabel.text = text; } [self updateLayout]; } -(void)setText:(NSSsortingng *)text andFont:(UIFont*)font forLabel:(int)labelNum { if( [self.labels count] > labelNum && labelNum >= 0 ) { UILabel * thisLabel = [self.labels objectAtIndex:labelNum]; thisLabel.text = text; thisLabel.font = font; } [self updateLayout]; } -(void)setText:(NSSsortingng *)text andColor:(UIColor*)color forLabel:(int)labelNum { if( [self.labels count] > labelNum && labelNum >= 0 ) { UILabel * thisLabel = [self.labels objectAtIndex:labelNum]; thisLabel.text = text; thisLabel.textColor = color; } [self updateLayout]; } - (void)setText:(NSSsortingng *)text andFont:(UIFont*)font andColor:(UIColor*)color forLabel:(int)labelNum { if( [self.labels count] > labelNum && labelNum >= 0 ) { UILabel * thisLabel = [self.labels objectAtIndex:labelNum]; thisLabel.text = text; thisLabel.font = font; thisLabel.textColor = color; } [self updateLayout]; } - (void)updateLayout { int thisX; int thisY; int totalWidth = 0; int offsetX = 0; int sizes[[self.labels count]][2]; int i = 0; for (UILabel * thisLabel in self.labels) { CGSize size = [thisLabel.text sizeWithFont:thisLabel.font constrainedToSize:CGSizeMake(9999, 9999) lineBreakMode:thisLabel.lineBreakMode]; sizes[i][0] = size.width; sizes[i][1] = size.height; totalWidth+= size.width; i++; } i = 0; for (UILabel * thisLabel in self.labels) { // X switch (self.contentMode) { case UIViewContentModeRight: case UIViewContentModeBottomRight: case UIViewContentModeTopRight: thisX = self.frame.size.width - totalWidth + offsetX; break; case UIViewContentModeCenter: thisX = (self.frame.size.width - totalWidth) / 2 + offsetX; break; default: thisX = offsetX; break; } // Y switch (self.contentMode) { case UIViewContentModeBottom: case UIViewContentModeBottomLeft: case UIViewContentModeBottomRight: thisY = self.frame.size.height - sizes[i][1]; break; case UIViewContentModeCenter: thisY = (self.frame.size.height - sizes[i][1]) / 2; break; default: thisY = 0; break; } thisLabel.frame = CGRectMake( thisX, thisY, sizes[i][0], sizes[i][1] ); offsetX += sizes[i][0]; i++; } } - (void)dealloc { [labels release]; labels = nil; [containerView release]; containerView = nil; [super dealloc]; } @end 

Utiliser l’API CoreText sera beaucoup plus rapide.

Voici quelques exemples

En gros, les choses à faire sont les suivantes: 1: Créer la sous-classe UIView 2: Dans la méthode drawRect: ajoutez la logique de dessin du texte.

La logique de dessin du texte: – Vous devrez connaître la plage du “nom”, donc si Tom : Un message. est votre chaîne, vous devrez appliquer une police différente pour la plage (0, 3).

Vous pouvez tout personnaliser avec CoreText 🙂

Salut OHAtsortingbutelabel est un bon moyen pour cela.Vous pouvez vous référer à l’exemple de code avec le lien ci-dessous https://github.com/AliSoftware/OHAtsortingbutedLabel Importer le cadre OHAtsortingbute de celui-ci et vous pouvez définir votre étiquette comme ci-dessous

  OHAtsortingbutedLabel *lblText; lblText = [[OHAtsortingbutedLabel alloc] initWithFrame:CGRectMake(10,10,100,19)]; lblText.backgroundColor = [UIColor clearColor]; lblText.textAlignment = UITextAlignmentCenter; lblText.font = [UIFont fontWithName:@"BoschSans-Regular" size:10]; NSSsortingng *strText=@"Tom: Some message."; NSMutableAtsortingbutedSsortingng* attrStr = [NSMutableAtsortingbutedSsortingng atsortingbutedSsortingngWithSsortingng: strText]; NSRange rangeOfSubssortingng = [strVersion rangeOfSsortingng:@“Tom:]; if (rangeOfSubssortingng.location != NSNotFound) { [attrStr setFontName:@"BoschSans-BOLD" size:10.0 range:rangeOfSubssortingng]; } else { } lblText.atsortingbutedText = attrStr; [self.View addSubview: lblText]; 

Une option serait d’utiliser un UIWebView au lieu de UILabel.

Un exemple: http://iphoneincubator.com/blog/windows-views/display-rich-text-using-a-uiwebview

il est assez facile de construire votre propre code HTML =>

 UIWebView *titleAd = [UIWebView alloc] init...; NSSsortingng *cssSsortingng = [NSSsortingng ssortingngWithFormat:@".title {font-family: HelveticaNeue; text-decoration: bold; font-size: %fpt; color: #4083a9;} .author {font-family: HelveticaNeue; text-decoration: bold; font-size: %fpt; color: #3e4545;}",__FONTSIZE_29__, __FONTSIZE_21__]; NSSsortingng *htmlSsortingng = [NSSsortingng ssortingngWithFormat:@"     

%@ proposé par %@

", cssSsortingng, [table title], [table nameOwner]]; [titleAd loadHTMLSsortingng:htmlSsortingng baseURL:nil];