使用UIWebView可能会很慢,所以如果这是个问题,那么CoreText是一种更好的选择。
以下是使用CoreText在视图上显示带属性字符串的代码。它有点像UILabel缩进。我留下了一些其他段落格式选项,以说明如何设置其他段落属性并将属性字符串设置为粗体。请记住,您需要添加CoreText框架,否则您将获得构建错误。
这段代码不会完全调整最后一行。不确定您是否可以免费获取此功能。
.h文件
#import <UIKit/UIKit.h>
#import <CoreText/CoreText.h> // needed for CTFontRef, CTFontCreateWithName
@interface SmartLabel : UIView
{
NSMutableAttributedString* _pgSmartString;
}
@property (nonatomic, retain) NSMutableAttributedString* smartString;
- (void) setText: (NSString*) string;
- (void) formatString;
@end
文件是 .m 文件
#import "SmartLabel.h"
@implementation SmartLabel
@synthesize smartString = _pgSmartString;
- (void)dealloc
{
[_pgSmartString release];
[super dealloc];
}
- (id)initWithFrame:(CGRect)frame;
{
if ((self = [super initWithFrame:frame]))
{
[self setBackgroundColor: [UIColor clearColor]];
}
return self;
}
- (void)drawRect:(CGRect)rect
{
CGContextRef graphicsContext = UIGraphicsGetCurrentContext();
CGContextSetTextMatrix(graphicsContext, CGAffineTransformIdentity);
CGContextTranslateCTM(graphicsContext, 0, self.bounds.size.height);
CGContextScaleCTM(graphicsContext, 1.0, -1.0);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)[self smartString]);
CGRect bounds = [self bounds];
bounds.origin.x = bounds.origin.x + 8;
bounds.size.width = bounds.size.width - 16;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, bounds);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, [[self smartString] length]), path, NULL);
CFRelease(path);
CTFrameDraw(frame, graphicsContext);
CFRelease(frame);
CFRelease(framesetter);
}
- (void) setText: (NSString*) string;
{
NSMutableAttributedString* attributedString = [[NSMutableAttributedString alloc] initWithString:string];
[self setSmartString:attributedString];
[attributedString release];
[self formatString];
}
- (void) formatString;
{
CTTextAlignment alignment = kCTJustifiedTextAlignment;
CGFloat paragraphSpacing = 11.0;
CGFloat paragraphSpacingBefore = 0.0;
CGFloat firstLineHeadIndent = 0.0;
CGFloat headIndent = 0.0;
CTParagraphStyleSetting altSettings[] =
{
{ kCTParagraphStyleSpecifierAlignment, sizeof(CTTextAlignment), &alignment},
{ kCTParagraphStyleSpecifierFirstLineHeadIndent, sizeof(CGFloat), &firstLineHeadIndent},
{ kCTParagraphStyleSpecifierHeadIndent, sizeof(CGFloat), &headIndent},
{ kCTParagraphStyleSpecifierParagraphSpacing, sizeof(CGFloat), ¶graphSpacing},
{ kCTParagraphStyleSpecifierParagraphSpacingBefore, sizeof(CGFloat), ¶graphSpacingBefore},
};
CTParagraphStyleRef style;
style = CTParagraphStyleCreate( altSettings, sizeof(altSettings) / sizeof(CTParagraphStyleSetting) );
if ( style == NULL )
{
NSLog(@"*** WARNING *** Unable To Create CTParagraphStyle in apply paragraph formatting" );
return;
}
[[self smartString] addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:(NSObject*)style,(NSString*) kCTParagraphStyleAttributeName, nil] range:NSMakeRange(0,[[self smartString] length])];
CFRelease(style);
UIFont* boldFont = [UIFont boldSystemFontOfSize:12.0];
CTFontRef boldCoreTextFontReference = CTFontCreateWithName ((CFStringRef)[boldFont fontName],[boldFont pointSize], NULL);
[[self smartString] addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:(NSObject*)boldCoreTextFontReference,(NSString*) kCTFontAttributeName, nil] range:NSMakeRange(0,[[self smartString] length])];
}
@end
并且为了投入使用,可以像这样:
SmartLabel* smartLabel = [[SmartLabel alloc] initWithFrame:CGRectMake(20, 120, 90, 140.0)];
[[self window] addSubview:smartLabel];
[smartLabel setText:@"While the saved costs of physical manufacturing and shipping"];
[smartLabel release];