您的位置:首页 > 移动开发 > IOS开发

IOS CoreText系列二:简单使用

2016-11-17 09:39 423 查看
前言:上文主要针对CoreText做一些了解,接下来说一下简单的使用。

/*
通常处理步聚:

1.使用core text就是先有一个要显示的string,然后定义这个string每个部分的样式->attributedString -> 生成 CTFramesetter -> 得到CTFrame -> 绘制(CTFrameDraw)
其中可以更详细的设置换行方式,对齐方式,绘制区域的大小等。
2.绘制只是显示,点击事件就需要一个判断了。
CTFrame 包含了多个CTLine,并且可以得到各个line的其实位置与大小。判断点击处在不在某个line上。CTLine 又可以判断这个点(相对于ctline的坐标)处的文字范围。然后遍历这个string的所有NSTextCheckingResult,根据result的rang判断点击处在不在这个rang上,从而得到点击的链接与位置。
*/
举例说明:
//设置字体属性
CTFontRef font = CTFontCreateWithName(CFSTR("Georigia"), 40, NULL);
[mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];


//设置斜体字
CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName, 14, NULL);
[mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];



//设置下划线
[mabString addAttribute:(id)kCTUnderlineStyleAttributeName value:[NSNumber numberWithInt:kCTUnderlineStyleDouble] range:range];



//设置字体间距
long margin = 10;
CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &margin);
[mabString addAttribute:(id)kCTKernAttributeName value:(__bridge id)number range:range];


//设置字体颜色为前影色
CFBooleanRef flag = kCFBooleanTrue;
[mabString addAttribute:(id)kCTForegroundColorFromContextAttributeName value:(__bridge id)flag range:range];
无明显效果
//设置字体颜色
[mabString addAttribute:(id)kCTForegroundColorAttributeName value:[UIColor redColor] range:range];




//设置空心字
long number= 2;
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
[mabString addAttribute:(id)kCTStrokeWidthAttributeName value:(__bridge id)num range:NSMakeRange(0, str.length)];


//设置空心字
long number= 2;
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
[mabString addAttribute:(id)kCTStrokeWidthAttributeName value:(__bridge id)num range:NSMakeRange(0, str.length)];
//设置空心字颜色
[mabString addAttribute:(id)kCTStrokeColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, str.length)];



详细代码:

.h文件

#import <UIKit/UIKit.h>

@interface HSCoreTextView : UIView

@end

.m文件
#import "HSCoreTextView.h"
#import <CoreText/CoreText.h>

/*
通常处理步聚:

1.使用core text就是先有一个要显示的string,然后定义这个string每个部分的样式->attributedString -> 生成 CTFramesetter -> 得到CTFrame -> 绘制(CTFrameDraw)
其中可以更详细的设置换行方式,对齐方式,绘制区域的大小等。
2.绘制只是显示,点击事件就需要一个判断了。
CTFrame 包含了多个CTLine,并且可以得到各个line的其实位置与大小。判断点击处在不在某个line上。CTLine 又可以判断这个点(相对于ctline的坐标)处的文字范围。然后遍历这个string的所有NSTextCheckingResult,根据result的rang判断点击处在不在这个rang上,从而得到点击的链接与位置。
*/

@implementation HSCoreTextView

- (void)drawRect:(CGRect)rect
{
[self characterAttribute];
}

- (void)characterAttribute
{
//1.创建NSMutableAttributedString
NSString *str = @"Most want is you,the most do not want to bother is also you.最想的是你,最不想打扰的也是你.";
NSMutableAttributedString *mabString = [[NSMutableAttributedString alloc] initWithString:str];

//2.定义样式
//2.1开始编辑
[mabString beginEditing];
NSRange range = NSMakeRange(0, 4);

//2.2样式设置
//设置字体属性
// CTFontRef font = CTFontCreateWithName(CFSTR("Georigia"), 40, NULL);
// [mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];

//设置斜体字
// CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName, 14, NULL);
// [mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];

//设置下划线
// [mabString addAttribute:(id)kCTUnderlineStyleAttributeName value:[NSNumber numberWithInt:kCTUnderlineStyleDouble] range:range];

// //设置字体间距
// long margin = 10;
// CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &margin);
// [mabString addAttribute:(id)kCTKernAttributeName value:(__bridge id)number range:range];

//设置字体颜色
[mabString addAttribute:(id)kCTForegroundColorAttributeName value:[UIColor redColor] range:range];

//设置字体颜色为前影色
// CFBooleanRef flag = kCFBooleanTrue;
// [mabString addAttribute:(id)kCTForegroundColorFromContextAttributeName value:(__bridge id)flag range:range];

//设置空心字
long number= 2;
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
[mabString addAttribute:(id)kCTStrokeWidthAttributeName value:(__bridge id)num range:NSMakeRange(0, str.length)];
//设置空心字颜色
[mabString addAttribute:(id)kCTStrokeColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, str.length)];

//2.3结束编辑
[mabString endEditing];

//3.生成CTFramesetter
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)mabString);

//4.得到CTFrame
//4.1创建路径
CGMutablePathRef path = CGPathCreateMutable();
//4.2添加路径
CGPathAddRect(path, NULL, CGRectMake(10, 0, self.bounds.size.width - 20, self.bounds.size.height));
//获得CTFrame
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);

//5.绘制(CTFrameDraw)
//5.1获取上下文
CGContextRef context = UIGraphicsGetCurrentContext();
//5.2设置文本矩阵
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
//压栈,压入图形状态栈中.每个图形上下文维护一个图形状态栈,并不是所有的当前绘画环境的图形状态的元素都被保存。图形状态中不考虑当前路径,所以不保存
//5.3保存现在得上下文图形状态。不管后续对context上绘制什么都不会影响真正得屏幕
CGContextSaveGState(context);
//x,y轴方向移动
CGContextTranslateCTM(context, 0, self.bounds.size.height);
//缩放x,y轴方向缩放,-1.0为反向1.0倍,坐标系转换,沿x轴翻转180度
CGContextScaleCTM(context, 1.0, -1.0);

CTFrameDraw(frame, context);

//6.释放
CGPathRelease(path);
CFRelease(framesetter);

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: