- /*
- 通常处理步聚:
- 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
- /*
- 通常处理步聚:
- 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