iPhone:具有多种字体的可变长度,多行字符串的UILabel

时间:2011-05-16 08:50:58

标签: iphone objective-c ios fonts uilabel

我想在iPhone上用UILabel做这样的事情:

John Doe,Jane Doe,John Smith,
Jane Smith
喜欢这张照片。

我可以绘制自己的文本并让它在同一行上实现多种字体,就像在question here中一样,但是一旦跨越多行,那种解决方案似乎并不真正起作用,因为{ {1}}方法返回一个sizeWithFont:forWidth:lineBreakMode:,我想它要么做到这样:

John Doe,Jane Doe,John Smith,Jane Smith 喜欢这张照片。

或者像这样:

John Doe,Jane Doe,John Smith,
简史密斯

喜欢这张照片。

但是我想继续第二个字体,第一个字体在第一个字体处于同一条线上。有没有办法在iPhone上实现这一点?

2 个答案:

答案 0 :(得分:1)

我使用Core Text来处理这些文本,以便在某些地方显示不同的字体。 Core Text在更改字体,大小和设置段落属性方面为您提供了很大的灵活性。有关核心文本的更多信息,请访问http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/CoreText_Programming/Introduction/Introduction.html

为您举例说明如何完成:

-(void) drawLayer:(CALayer *)layerToDraw inContext:(CGContextRef)context {
NSMutableAttributedString* someString = [[NSMutableAttributedString alloc] initWithString:@"New String"];
CTFontRef font = CTFontCreateWithName(@"Arial", 25, NULL);
[someString addAttribute:(id)kCTFontAttributeName value:(id)font range:NSMakeRange(0, 3)];
CFRelease(font);

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, labelLayer.bounds);

CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, 0, labelLayer.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(someString);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);

CTFrameDraw(frame, context);


CFRelease(framesetter);
CFRelease(frame);
CFRelease(path);
}

但是如果项目中的这种用法非常少,你可以使用UIWebView来显示这样的文本(请记住这会消耗更多的资源)

答案 1 :(得分:1)

有一种方法可以设置不同/多种字体& Label上的其他属性使用NSMutableAttributedString。 Foll是我的代码:

 UIFont *ArialFont = [UIFont fontWithName:@"arial" size:18.0];
 NSDictionary *arialdict = [NSDictionary dictionaryWithObject: ArialFont forKey:NSFontAttributeName];    
 NSMutableAttributedString *AattrString = [[NSMutableAttributedString alloc] initWithString:title attributes: arialdict];

 UIFont *VerdanaFont = [UIFont fontWithName:@"verdana" size:12.0];
 NSDictionary *veradnadict = [NSDictionary dictionaryWithObject:VerdanaFont forKey:NSFontAttributeName];
 NSMutableAttributedString *VattrString = [[NSMutableAttributedString alloc]initWithString: newsDate attributes:veradnadict];    
 [VattrString addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:(NSMakeRange(0, 15))];

 [AattrString appendAttributedString:VattrString];


 lblText.attributedText = AattrString;

请注意,lblText是UILabel,outlet作为文件所有者。 人们可以继续追加他想要的NSMutableAttributedString ..

另请注意,我添加了verdana&我项目中的arial字体&为此添加了一个plist。