iOS quartzCore第八章—— CATextLayer的运用

用户界面是无法从一个单独的图片里面构建的。一个设计良好的图标能够很好地表现一个按钮或控件的意图,不过你迟早都要需要一个不错的老式风格的文本标签。

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

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

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

让我们来尝试用CATextLayer来显示一些文字。清单6.2的代码实现了这一功能,结果如图6.2所示。

清单6.2 用CATextLayer来实现一个UILabel

@interface ViewController ()

@property (nonatomic, weak) IBOutlet UIView *labelView;
@end
@implementation ViewController
 - (void)viewDidLoad
{
  [super viewDidLoad]; //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 = @"Lorem ipsum dolor sit amet, consectetur adipiscing \ elit. Quisque massa arcu, eleifend vel varius in, facilisis pulvinar \ leo. Nunc quis nunc at mauris pharetra condimentum ut ac neque. Nunc elementum, libero ut porttitor dictum, diam odio congue lacus, vel \ fringilla sapien diam at purus. Etiam suscipit pretium nunc sit amet \ lobortis"; //set layer text textLayer.string = text;
} @end

图6.2 用CATextLayer来显示一个纯文本标签

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

textLayer.contentsScale = [UIScreen mainScreen].scale;

这样就解决了这个问题(如图6.3)

图6.3 设置contentsScale来匹配屏幕

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

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

CATextLayer *lary = [CATextLayer layer];

lary.backgroundColor = [UIColor blueColor].CGColor;

lary.string = @"dasfasa";

lary.bounds = CGRectMake(0, 0, 320, 20);

lary.position = self.view.center;

//    lary.contentsScale = 5;

//    lary.font = @"HiraKakuProN-W3"; //字体的名字 不是 UIFont

lary.fontSize = 12.f; //字体的大小

lary.alignmentMode = kCAAlignmentCenter;//字体的对齐方式

lary.foregroundColor = [UIColor redColor].CGColor;//字体的颜色

[self.view.layer addSublayer:lary];

时间: 2024-10-10 00:58:06

iOS quartzCore第八章—— CATextLayer的运用的相关文章

iOS quartzCore第九章—— CoreAnimation

CoreAnimation动画入门 NOV 1ST, 2015 6:16 PM 一.动画的基础分类 上述我们可以看到动画大体可以分为如下几类: 属性说明 CAAnaimation                  抽象类,不具备动画效果,必须用它的子类才有动画效果 CAAnimaitionGroup         动画组,可以同时进行缩放,旋转 CAPropertyAnimation      抽象类,本身不具备动画效果,只有子类才有 CABasicAnimation           基本

iOS quartzCore第六章—— CAReplicatorLayer的运用

序 CAReplicatorLayer可以复制自己子层的layer,并且复制的出来的layer和原来的子layer拥有相同的动效.然后通过设置一些属性,就可以完成很酷的效果,非常强大.. 效果 love_music.gif Demo 建议先下载demo,再结合下面的分析,会好理解点.地址https://github.com/Resory/RYReplicatorLayer 逻辑 本文主要讲述love动效的制作.music动效可参照love动效注释. 首先我们要得到一个love路径,这个路径用UI

iOS quartzCore第五章——CAShapeLayer画各种图形 结合UIBezierPath

CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形,当然,你也可以使用其他方式来画,随你. 首先CAShapeLayer 自身有path ,fillColor ,fillRule ,strokeColor ,strokeStart , strokeEnd , lineWidth(线宽,用点表示单位) ,miterLimit ,lineCap(线条结尾的样子) , lineJoin(线条之间的结合点的样子), lineDashPhase 和lin

使用Core Image 处理图像

在iOS和 OS X中,Core Image有三个处理图像的类: * CIFilter 是一个代表结果(效果)的可变的对象.一个滤镜对象至少要有一个输入参数并产生一个输出图像. * CIImage是一个代表图像的不可变的对象.你可以synthesize图像数据或者从文件或其他 CIFilter对象的输出得到它. * CIContext是一个被滤镜处理后Core Image 绘制的结果的对象.一个Core Image context可以是基于CPU或者基于GPU. (在APP中使用Core Ima

第八章:iOS网络应用编程

一.检测网络状态 当应用程序需要访问网络时,它首先应该检查设备的网络状态,确认设备的网络环境及连接情况,并针对这些情况提醒用户做出相应的处理.最好能监听设备的网络状态的改变,当设备网络状态连接.断开时,程序也应该有相应的处理. 1.检查网络状态 检查设备的网络状态,需要如下两个步骤: ①.下载.添加Reachability类: 通过Xcode的帮助系统搜索Reachability,接下来下就可以在"Sample Code"分类中看到Reachability实例项目: 选择"R

iOS高级-QuartzCore框架-2D绘图

一.理论知识什么是Quartz2D Quartz2D实例 Quartz2D在iOS开发中的价值 图形上下文 自定义View drawRect:方法 绘图顺序(后盖前) Quartz2D须知 二.画线段1.新建一个类MJLineView,继承自UIView.2.拖一个UIView,Class为MJLineView3.在drawRect:方法里画图-(void)drawRect:(CGRect)rect{ //1.获得图形上下文 CGContextRef ctx = UIGraphicsGetCur

iOS之CATextLayer属性简介

1.CATextLayer简介 CATextLayer快速高效简单地来渲染纯文本.NSAttributedString /* The text layer provides simple text layout and rendering of plain * or attributed strings. The first line is aligned to the top of the * layer. */ NS_ASSUME_NONNULL_BEGIN CA_CLASS_AVAILAB

iOS高级-QuartzCore框架-CoreAnimation和UIView动画的使用

一.UIView封装的动画图层动画有2个致命的缺点:1>默认情况下会反弹.2>你所看到的动画都是假象,图层的属性一直都没有变过所以建议能用UIView就用UIView,实在不行再用图层.1.UIView的移动动画-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [UIView beginAnimations:nil context:nil]; //动画执行完毕后,会自动调用self的animateStop方法(用这

iOS高级-QuartzCore框架-CALayer图层

掌握CALayer的基本属性CALayer和UIView的关系position和anchorPoint的作用 CALayer CALayer的基本使用 CALayer的属性 //边框宽度(从Layer里面圈出一块出来作为边框)self.purpleView.layer.borderWidth = 10;//边框颜色self.purpleView.layer.borderColor = [UIColor redColor] .CGColor;//圆角self.purpleView.layer.co