coreText的一些基础用法
2015-06-24 17:34
351 查看
API接口文档。
https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CoreText_Framework_Ref/_index.html
CTFrame 作为一个整体的画布(Canvas),其中由行(CTLine)组成,而每行可以分为一个或多个小方块(CTRun)。
注意:你不需要自己创建CTRun,Core Text将根据NSAttributedString的属性来自动创建CTRun。每个CTRun对象对应不同的属性,正因此,你可以自由的控制字体、颜色、字间距等等信息。
通常处理步聚:
1.使用core text就是先有一个要显示的string,然后定义这个string每个部分的样式->attributedString -> 生成 CTFramesetter -> 得到CTFrame -> 绘制(CTFrameDraw)
其中可以更详细的设置换行方式,对齐方式,绘制区域的大小等。
2.绘制只是显示,点击事件就需要一个判断了。
CTFrame 包含了多个CTLine,并且可以得到各个line的其实位置与大小。判断点击处在不在某个line上。CTLine 又可以判断这个点(相对于ctline的坐标)处的文字范围。然后遍历这个string的所有NSTextCheckingResult,根据result的rang判断点击处在不在这个rang上,从而得到点击的链接与位置。
1 添加CoreText.framework
2 自定义类
- (void)drawRect:(CGRect)rect
{
NSString *text = self.mutableText;
NSMutableAttributedString *mabstring = [[NSMutableAttributedString
alloc]initWithString:text];
//设置字体属性
CTFontRef font = CTFontCreateWithName(CFSTR("Georgia"),
40,NULL);
[mabstring
addAttribute:(id)kCTFontAttributeName
value:(__bridge
id)font range:NSMakeRange(0,4)];
//设置斜体
CTFontRef font2 =
CTFontCreateWithName((CFStringRef)[UIFont
italicSystemFontOfSize:18].fontName,
14,
NULL);
[mabstring
addAttribute:(id)kCTFontAttributeName
value:(__bridge
id)font2 range:NSMakeRange(5,
6)];
//设置下划线
[mabstring addAttribute:(id)kCTUnderlineStyleAttributeName
value:(id)[NSNumber
numberWithInt:kCTUnderlineStyleThick]
range:NSMakeRange(11,
5)];
//设置下划线颜色
[mabstring addAttribute:(id)kCTUnderlineColorAttributeName
value:(id)[UIColor
redColor].CGColor
range:NSMakeRange(11,
5)];
//设置字体简隔
long num = 15;
CFNumberRef num1 =
CFNumberCreate(kCFAllocatorDefault,
kCFNumberSInt8Type,&num);
[mabstring
addAttribute:(id)kCTKernAttributeName
value:(__bridge
id)num1 range:NSMakeRange(20,
4)];
//设置空心字
long num2 = 2;
CFNumberRef num3 =
CFNumberCreate(kCFAllocatorDefault,
kCFNumberSInt8Type, &num2);
[mabstring
addAttribute:(id)kCTStrokeWidthAttributeName
value:(__bridge
id)num3 range:NSMakeRange(25,
4)];
[mabstring addAttribute:(id)kCTStrokeColorAttributeName
value:(id)[UIColor
blueColor].CGColor
range:NSMakeRange(25,
4)];
//多属性设置
NSMutableDictionary *attributes = [NSMutableDictionary
dictionaryWithObject:(id)[UIColor
redColor]
forKey:(id)kCTForegroundColorAttributeName];
CTFontRef font3 =
CTFontCreateWithName((CFStringRef)[UIFont
italicSystemFontOfSize:25].fontName,
19,NULL);
[attributes
setObject:(__bridge
id)font3 forKey:(id)kCTFontAttributeName];
[attributes setObject:(id)[NSNumber
numberWithInt:kCTUnderlineStyleDouble]
forKey:(id)kCTUnderlineStyleAttributeName];
[mabstring
addAttributes:attributes
range:NSMakeRange(mabstring.length-6,
5)];
//url
设置字体和颜色
//判断是否是url的正则表达式
NSString *regulaStr =
@"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)";
NSRegularExpression *regex = [NSRegularExpression
regularExpressionWithPattern:regulaStr
options:NSRegularExpressionCaseInsensitive
error:nil];
//text中符合正则表达式的结果
NSArray * arrayOfAllMatches = [regex
matchesInString:text options:0
range:NSMakeRange(0, [text
length])];
//设置字体, __bridge
关键字来实现id类型与void*类型的相互转换
CTFontRef fontRef =
CTFontCreateWithName((__bridge
CFStringRef)[NSString
stringWithFormat:@"Arial"],
17,
NULL);
//开始设置字体及显示字体的颜色
[arrayOfAllMatches
enumerateObjectsUsingBlock:^(NSTextCheckingResult * obj,
NSUInteger idx, BOOL *stop) {
[mabstring
addAttribute:(NSString *)kCTFontAttributeName
value:(__bridge
id)fontRef range:obj.range];
[mabstring addAttribute:(NSString *)kCTForegroundColorAttributeName
value:(__bridge
id)[UIColor
blueColor].CGColor
range:obj.range];
}];
CGContextRef cgc =
UIGraphicsGetCurrentContext();
CGContextSaveGState(cgc);
//图像方向转换,在iOS的2D绘图中采用的就是我们熟知的直角坐标系,即原点在左下方,右上为正轴,这里要注意的是和我们在视图(UIView)中布局的坐标系是不一样的,他的圆点在左上,右下为正轴。当我们在视图的drawRect中工作的时候拿到的画板已经是左上坐标的了,那这时候你要去把一个有自己坐标体系的内容直接绘制,就会出现坐标不一致问题,例如直接绘制图片就会倒立
CGContextConcatCTM(cgc,
CGAffineTransformScale(CGAffineTransformMakeTranslation(0,
self.bounds.size.height),
1.f, -1.f));
//读取NSMutableAttributedString
CTFramesetterRef framesetter =
CTFramesetterCreateWithAttributedString((__bridge
CFAttributedStringRef)mabstring);
CGRect drawingRect =
self.bounds;
//
创建一个Path句柄
CGMutablePathRef path =
CGPathCreateMutable();
//在此句柄的基础上
画出此矩形
CGPathAddRect(path,
NULL, drawingRect);
//获取所画text的frame
CTFrameRef textFrame =
CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path,
NULL);
CGPathRelease(path);
CFRelease(framesetter);
//draw begin
CTFrameDraw(textFrame, cgc);
CGContextRestoreGState(cgc);
}
https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CoreText_Framework_Ref/_index.html
CTFrame 作为一个整体的画布(Canvas),其中由行(CTLine)组成,而每行可以分为一个或多个小方块(CTRun)。
注意:你不需要自己创建CTRun,Core Text将根据NSAttributedString的属性来自动创建CTRun。每个CTRun对象对应不同的属性,正因此,你可以自由的控制字体、颜色、字间距等等信息。
通常处理步聚:
1.使用core text就是先有一个要显示的string,然后定义这个string每个部分的样式->attributedString -> 生成 CTFramesetter -> 得到CTFrame -> 绘制(CTFrameDraw)
其中可以更详细的设置换行方式,对齐方式,绘制区域的大小等。
2.绘制只是显示,点击事件就需要一个判断了。
CTFrame 包含了多个CTLine,并且可以得到各个line的其实位置与大小。判断点击处在不在某个line上。CTLine 又可以判断这个点(相对于ctline的坐标)处的文字范围。然后遍历这个string的所有NSTextCheckingResult,根据result的rang判断点击处在不在这个rang上,从而得到点击的链接与位置。
1 添加CoreText.framework
2 自定义类
- (void)drawRect:(CGRect)rect
{
NSString *text = self.mutableText;
NSMutableAttributedString *mabstring = [[NSMutableAttributedString
alloc]initWithString:text];
//设置字体属性
CTFontRef font = CTFontCreateWithName(CFSTR("Georgia"),
40,NULL);
[mabstring
addAttribute:(id)kCTFontAttributeName
value:(__bridge
id)font range:NSMakeRange(0,4)];
//设置斜体
CTFontRef font2 =
CTFontCreateWithName((CFStringRef)[UIFont
italicSystemFontOfSize:18].fontName,
14,
NULL);
[mabstring
addAttribute:(id)kCTFontAttributeName
value:(__bridge
id)font2 range:NSMakeRange(5,
6)];
//设置下划线
[mabstring addAttribute:(id)kCTUnderlineStyleAttributeName
value:(id)[NSNumber
numberWithInt:kCTUnderlineStyleThick]
range:NSMakeRange(11,
5)];
//设置下划线颜色
[mabstring addAttribute:(id)kCTUnderlineColorAttributeName
value:(id)[UIColor
redColor].CGColor
range:NSMakeRange(11,
5)];
//设置字体简隔
long num = 15;
CFNumberRef num1 =
CFNumberCreate(kCFAllocatorDefault,
kCFNumberSInt8Type,&num);
[mabstring
addAttribute:(id)kCTKernAttributeName
value:(__bridge
id)num1 range:NSMakeRange(20,
4)];
//设置空心字
long num2 = 2;
CFNumberRef num3 =
CFNumberCreate(kCFAllocatorDefault,
kCFNumberSInt8Type, &num2);
[mabstring
addAttribute:(id)kCTStrokeWidthAttributeName
value:(__bridge
id)num3 range:NSMakeRange(25,
4)];
[mabstring addAttribute:(id)kCTStrokeColorAttributeName
value:(id)[UIColor
blueColor].CGColor
range:NSMakeRange(25,
4)];
//多属性设置
NSMutableDictionary *attributes = [NSMutableDictionary
dictionaryWithObject:(id)[UIColor
redColor]
forKey:(id)kCTForegroundColorAttributeName];
CTFontRef font3 =
CTFontCreateWithName((CFStringRef)[UIFont
italicSystemFontOfSize:25].fontName,
19,NULL);
[attributes
setObject:(__bridge
id)font3 forKey:(id)kCTFontAttributeName];
[attributes setObject:(id)[NSNumber
numberWithInt:kCTUnderlineStyleDouble]
forKey:(id)kCTUnderlineStyleAttributeName];
[mabstring
addAttributes:attributes
range:NSMakeRange(mabstring.length-6,
5)];
//url
设置字体和颜色
//判断是否是url的正则表达式
NSString *regulaStr =
@"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)";
NSRegularExpression *regex = [NSRegularExpression
regularExpressionWithPattern:regulaStr
options:NSRegularExpressionCaseInsensitive
error:nil];
//text中符合正则表达式的结果
NSArray * arrayOfAllMatches = [regex
matchesInString:text options:0
range:NSMakeRange(0, [text
length])];
//设置字体, __bridge
关键字来实现id类型与void*类型的相互转换
CTFontRef fontRef =
CTFontCreateWithName((__bridge
CFStringRef)[NSString
stringWithFormat:@"Arial"],
17,
NULL);
//开始设置字体及显示字体的颜色
[arrayOfAllMatches
enumerateObjectsUsingBlock:^(NSTextCheckingResult * obj,
NSUInteger idx, BOOL *stop) {
[mabstring
addAttribute:(NSString *)kCTFontAttributeName
value:(__bridge
id)fontRef range:obj.range];
[mabstring addAttribute:(NSString *)kCTForegroundColorAttributeName
value:(__bridge
id)[UIColor
blueColor].CGColor
range:obj.range];
}];
CGContextRef cgc =
UIGraphicsGetCurrentContext();
CGContextSaveGState(cgc);
//图像方向转换,在iOS的2D绘图中采用的就是我们熟知的直角坐标系,即原点在左下方,右上为正轴,这里要注意的是和我们在视图(UIView)中布局的坐标系是不一样的,他的圆点在左上,右下为正轴。当我们在视图的drawRect中工作的时候拿到的画板已经是左上坐标的了,那这时候你要去把一个有自己坐标体系的内容直接绘制,就会出现坐标不一致问题,例如直接绘制图片就会倒立
CGContextConcatCTM(cgc,
CGAffineTransformScale(CGAffineTransformMakeTranslation(0,
self.bounds.size.height),
1.f, -1.f));
//读取NSMutableAttributedString
CTFramesetterRef framesetter =
CTFramesetterCreateWithAttributedString((__bridge
CFAttributedStringRef)mabstring);
CGRect drawingRect =
self.bounds;
//
创建一个Path句柄
CGMutablePathRef path =
CGPathCreateMutable();
//在此句柄的基础上
画出此矩形
CGPathAddRect(path,
NULL, drawingRect);
//获取所画text的frame
CTFrameRef textFrame =
CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path,
NULL);
CGPathRelease(path);
CFRelease(framesetter);
//draw begin
CTFrameDraw(textFrame, cgc);
CGContextRestoreGState(cgc);
}
相关文章推荐
- oracle存储过程中游标的使用(包括带参数的游标)
- 22. 标签管理
- mySql的缓冲区分析
- 好看的复选框(Checkbox)效果
- MySQL 5.6 for Windows 解压缩版配置安装
- Linux Min装机--开机启动synergy
- mysql连接数据库命令-待续
- Chun 阅读笔记 - 如何做一个图片缓存库
- BZOJ 2843: 极地旅行社( LCT )
- 如何查看端口被占用
- python 调用jpush推送消息
- Hessian轻量级二进制远程调用框架
- GRE词汇应该这样学
- [iOS开发周边] 两个账号转让app流程
- linux 下更改文件名编码方式
- linux 下更改文件名编码方式
- Myeclipse中项目前边出现红色感叹号
- 实现项目下载需求时遇过的那些坑
- python mongo
- 使用BigDecimal进行精确运算