CATextLayer笔记

Core Animation提供了一个CALayer的子类CATextLayer,它以图层的形式包含了UILabel几乎所有的绘制特性,并且额外提供了一些新的特性。

同样,CATextLayer也要比UILabel渲染得快得多。很少有人知道在iOS 6及之前的版本,UILabel其实是通过WebKit来实现绘制的,这样就造成了当有很多文字的时候就会有极大的性能压力。而CATextLayer使用了Core text,并且渲染得非常快。

#import “ViewController.h”

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIView *labelView;

@end

@implementation ViewController

– (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    //create a text layer

    CATextLayer *textLayer = [CATextLayer layer];

    textLayer.frame = self.labelView.bounds;

    [self.labelView.layer addSublayer:textLayer];

    

    //set text attributes

    textLayer.foregroundColor = [UIColor blackColor].CGColor;

    textLayer.alignmentMode = kCAAlignmentJustified;

    textLayer.wrapped = YES;

    

    //choose a font

    UIFont *font = [UIFont systemFontOfSize:15];

    //set layer font

    CFStringRef fontName = (__bridge CFStringRef)(font.fontName);

    CGFontRef fontRef = CGFontCreateWithFontName(fontName);

    textLayer.font = fontRef;

    textLayer.fontSize = font.pointSize;

    CGFontRelease(fontRef);

    

    //choose some text

    NSString *text = @”窗前明月光,疑是地上霜。举头望明月,低头思故乡。hahahahahaha”;

    textLayer.string = text;

    

    //奇怪的地方:这些文本有一些像素化了。这是因为并没有以Retina的方式渲染,第二章提到了这个contentScale属性,用来决定图层内容应该以怎样的分辨率来渲染。contentsScale并不关心屏幕的拉伸因素而总是默认为1.0。如果我们想以Retina的质量来显示文字,我们就得手动地设置CATextLayercontentsScale属性

    textLayer.contentsScale = [UIScreen mainScreen].scale;

}

@end

未设置contentsScale的效果:

2

设置之后的效果:

1

 

CATextLayerfont属性不是一个UIFont类型,而是一个CFTypeRef类型。这样可以根据你的具体需要来决定字体属性应该是用CGFontRef类型还是CTFontRef类型(Core Text字体)。同时字体大小也是用fontSize属性单独设置的,因为CTFontRefCGFontRef并不像UIFont一样包含点大小。这个例子会告诉你如何将UIFont转换成CGFontRef

另外,CATextLayerstring属性并不是你想象的NSString类型,而是id类型。这样你既可以用NSString也可以用NSAttributedString来指定文本了(注意,NSAttributedString并不是NSString的子类)。属性化字符串是iOS用来渲染字体风格的机制,它以特定的方式来决定指定范围内的字符串的原始信息,比如字体,颜色,字重,斜体等。

分享到: 更多
Separator image Posted in IOS.

发表评论

电子邮件地址不会被公开。 必填项已用*标注