Mise à jour : Si vous êtes sous iOS 6+, utilisez UILabel.attributedText -- sinon....
J'ai créé cette sous-classe UIView de base pour prendre en charge une fonctionnalité similaire.
La liste des choses qu'elle ne prend pas en charge est plus longue que ce qu'elle fait, mais essentiellement elle vous permet de gérer une seule ligne de UILabel et de formater chaque élément comme vous le souhaitez. Cela me permet d'insérer du texte avec une couleur différente au milieu de la ligne, par exemple, et d'éviter d'utiliser le lourd UIWebView.
Je crée ces objets en plaçant un objet UIView dans mon interface (en utilisant Interface Builder) et en définissant le type de l'objet dans IB sur MultipartLabel. Ensuite, dans le code, j'appelle updateNumberOfLabels et les différents selecteurs 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:(NSString *)text forLabel:(int)labelNum;
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
}
[self updateLayout];
}
-(void)setText:(NSString *)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:(NSString *)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:(NSString *)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];
}
- Réactualiser la mise en page {
int thisX = 0;
// TODO quand il sera temps de prendre en charge des polices de différentes tailles, il faudra ajuster chaque valeur y pour aligner les 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
0 votes
Pourquoi avez-vous même besoin d'un UILabel, autant que je sache vous pouvez en faire une vue et ajouter autant de UILabel que vous le souhaitez
0 votes
Vous pouvez utiliser les mêmes outils que l'application facebook utilise: three20 Joe Hewitt, le développeur derrière l'application facebook a rendu public une grande partie de son travail. Vous pouvez le trouver ainsi que de nombreuses autres fonctionnalités ici: github.com/joehewitt/three20
0 votes
Vous ne pouvez pas le faire dans un UILabel... Mais ma suggestion est qu'au lieu d'utiliser plusieurs UILabel, concentrez-vous simplement sur NSAttributedString... Trouvez des UIControllers qui dessinent NSAttribute String car UILabel, UITextView ne prend pas en charge NSAttributedString... Contrôleur pour dessiner NSAttributedString