CATextLayer
2016-05-09 本文已影响3277人
ALiG
在界面上添加文本有两种;一种是: UILabel;第二种是:CATextLayer;
最近在改到一个菜单的demo 里面大量的弄到了这个,感觉挺有趣的有自己写demo 的、或者想写demo的可以看看要不要用这个,CATextLayer会比UILabel渲染得快得多,所以会减少demo的占用资源率,方便嵌入项目,减少使用资源。
在一个图层里面显示文字,完全可以借助图层代理直接将字符串使用Core Graphics写入图层的内容(这就是UILabel的精髓)。如果越过寄宿于图层的视图,直接在图层上操作,那其实相当繁琐。你要为每一个显示文字的图层创建一个能像图层代理一样工作的类,还要逻辑上判断哪个图层需要显示哪个字符串,更别提还要记录不同的字体,颜色等一系列乱七八糟的东西。但是,Core Animation提供了一个CALayer的子类CATextLayer,它以图层的形式包含了UILabel几乎所有的绘制特性,并且额外提供了一些新的特性。
iOS 6及之前的版本,UILabel其实是通过WebKit来实现绘制的,这样就造成了当有很多文字的时候就会有极大的性能压力。而CATextLayer使用了Core text,并且渲染得非常快
- (void)viewDidLoad
{
CATextLayer *lary = [CATextLayer layer];
lary.string = @"dasfasa";
lary.bounds = CGRectMake(0, 0, 320, 20);
lary.font = @"HiraKakuProN-W3";//字体的名字 不是 UIFont
lary.fontSize = 12.f;//字体的大小
或者
//UIFont *font = [UIFont systemFontOfSize:14];
// CFStringRef fontCFString = (__bridge CFStringRef)font.fontName;
// CGFontRef fontRef = CGFontCreateWithFontName(fontCFString);
// textLayer.font = fontRef;
// textLayer.fontSize = font.pointSize;
// CGFontRelease(fontRef); //与CFRelease的功能相当 当字体的null的时候不会引起程序出错
lary.wrapped = YES;//默认为No. 当Yes时,字符串自动适应layer的bounds大小
lary.alignmentMode = kCAAlignmentCenter;//字体的对齐方式
lary.position = CGPointMake(160, 410);//layer在view的位置 适用于跟随摸一个不固定长的的控件后面需要的
lary.contentsScale = [UIScreen mainScreen].scale;//解决文字模糊 以Retina方式来渲染,防止画出来的文本像素化
lary.foregroundColor =[UIColor redColor].CGColor;//字体的颜色 文本颜色
[self.view.layer addSublayer:lary];
}
推荐两个还不错的 我自己看了个大概 ,想细读的可以看楼下两个链接 看起来超级棒的。
https://zsisme.gitbooks.io/ios-/content/chapter1/layers-and-trees.html
http://www.cnblogs.com/daxiaxiaohao/p/4272722.html