专用图层-CATextLayer

作者: 细雨听风 | 来源:发表于2016-03-30 09:00 被阅读171次

    CATextLayer

    如果你想在一个图层里面显示文字,完全可以借助图层代理直接将字符串使用CoreGraphics写入图层的内容(这就是UILabel的精髓)。如果越过寄宿于图层的视图,直接在图层上操作,那其实相当繁琐。你要为一个显示文字的图层创建一个能像图层代理一样工作的类,还要逻辑上判断哪个图层需要显示哪个字符,更别提还要记录不同的字体,颜色等一系列乱七八糟的东西。

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

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

    让我们用CATextLayer来实现一个UILabel

    // 创建一个textLayer
    CATextLayer *textLayer = [CATextLayer layer];
    textLayer.frame = self.labelView.bounds;
    [self.labelView.layer addSublayer:textLayer];
    
    // 设置文字属性
    textLayer.foregroundColor = [UIColor blueColor].CGColor;
    textLayer.alignmentMode = kCAAlignmentJustified;
    textLayer.wrapped = YES;
    
    // 设置字体
    UIFont *font = [UIFont systemFontOfSize:15];
    
    CFStringRef fontName = (__bridge CFStringRef)(font.fontName);
    CGFontRef fontRef = CGFontCreateWithFontName(fontName);
    textLayer.font = fontRef;
    textLayer.fontSize = font.pointSize;
    CGFontRelease(fontRef);
    
    // 选择文本
    NSString *text = @"穿梭时间的画面的钟 从反方向 开始移动\
    回到当初爱你的时空 停格内容 不忠\
    所有回忆对着我进攻 我的伤口 被你拆封\
    誓言太沉重泪被纵容 脸上汹涌 失控\
    穿梭时间的画面的钟 从反方向 开始移动\
    回到当初爱你的时空 停格内容 不忠\
    所有回忆对着我进攻";
    textLayer.string = text;
    

    效果图:

    Mou icou

    如果你仔细看这个文本,你就会发现一个奇怪的地方:这些文本有一些像素化了。这是因为并没有以Retina的方式渲染,第二章提到了这个contentScale属性,用来决定图层内容应该以怎么样的粪便来渲染。contentsScale并不关心屏幕的拉伸因素而总是默认1.0。如果我们想以Retina的质量来显示位子,我们就得手动地设置CATextLayerContentScale属性,如下:

    textLayer.contentsScale = [UIScreen mainScreen].scale;
    

    CATextLayerfont属性不是一个UIFont类型,而是一个CFTypeRef类型。这样可以根据你具体需要来决定自提属性应该是用CGFontRef类型还是CTFontRef类型(Core Text字体).同时字体大小也是用fontSize属性单独设置的,因为CTFontRefCGFontRef并不像UIFont一样包含点大笑。这个例子会高手你如何将UIFont转换成CGFontRef
    另外,CATextLayerstring属性并不是你想象的NSString类型,而是id类型。这样你既可以使用NSString也可以使用NSAttributedString来指定文本了(注意,NSAttributedString并不是NSString的子类)。属性化字符串是iOS用来渲染字体风格的机制,它以特定的方式来决定指定范围内的字符串的原始信息,比如字体、颜色、字重、斜体等。

    相关文章

      网友评论

        本文标题:专用图层-CATextLayer

        本文链接:https://www.haomeiwen.com/subject/puwslttx.html