CATextLayer

2017-08-28  本文已影响26人  CharlyZheng

在界面上添加文本有两种;一种是: 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 {
    [super viewDidLoad];
    CATextLayer *lary = [CATextLayer layer];
    lary.string = @"dasfasa";
    lary.bounds = CGRectMake(0, 0, 320, 20);
    lary.font = (__bridge CFTypeRef _Nullable)(@"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.htmlhttp://www.cnblogs.com/daxiaxiaohao/p/4272722.html

上一篇下一篇

猜你喜欢

热点阅读