IOS CoreText系列二:简单使用

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

举例说明:

[objc]  view plain  copy
  1. //设置字体属性  
  2. CTFontRef font = CTFontCreateWithName(CFSTR("Georigia"), 40NULL);  
  3. [mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];  

[objc]  view plain  copy
  1. //设置斜体字  
  2. CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName14NULL);  
  3. [mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];  

[objc]  view plain  copy
  1. //设置下划线  
  2. [mabString addAttribute:(id)kCTUnderlineStyleAttributeName value:[NSNumber numberWithInt:kCTUnderlineStyleDouble] range:range];  

[objc]  view plain  copy
  1. //设置字体间距  
  2. long margin = 10;  
  3. CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &margin);  
  4. [mabString addAttribute:(id)kCTKernAttributeName value:(__bridge id)number range:range];  

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


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

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



详细代码:

.h文件

[objc]  view plain  copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface HSCoreTextView : UIView  
  4.   
  5. @end  

.m文件

[objc]  view plain  copy
  1. #import "HSCoreTextView.h"  
  2. #import <CoreText/CoreText.h>  
  3.   
  4. /* 
  5.  通常处理步聚: 
  6.   
  7.  1.使用core text就是先有一个要显示的string,然后定义这个string每个部分的样式->attributedString -> 生成 CTFramesetter -> 得到CTFrame -> 绘制(CTFrameDraw) 
  8.  其中可以更详细的设置换行方式,对齐方式,绘制区域的大小等。 
  9.  2.绘制只是显示,点击事件就需要一个判断了。 
  10.  CTFrame 包含了多个CTLine,并且可以得到各个line的其实位置与大小。判断点击处在不在某个line上。CTLine 又可以判断这个点(相对于ctline的坐标)处的文字范围。然后遍历这个string的所有NSTextCheckingResult,根据result的rang判断点击处在不在这个rang上,从而得到点击的链接与位置。 
  11.  */  
  12.   
  13. @implementation HSCoreTextView  
  14.   
  15. - (void)drawRect:(CGRect)rect  
  16. {  
  17.     [self characterAttribute];  
  18. }  
  19.   
  20. - (void)characterAttribute  
  21. {  
  22.     //1.创建NSMutableAttributedString  
  23.     NSString *str = @"Most want is you,the most do not want to bother is also you.最想的是你,最不想打扰的也是你.";  
  24.     NSMutableAttributedString *mabString = [[NSMutableAttributedString alloc] initWithString:str];  
  25.       
  26.     //2.定义样式  
  27.     //2.1开始编辑  
  28.     [mabString beginEditing];  
  29.     NSRange range = NSMakeRange(04);  
  30.       
  31.     //2.2样式设置  
  32.     //设置字体属性  
  33. //    CTFontRef font = CTFontCreateWithName(CFSTR("Georigia"), 40, NULL);  
  34. //    [mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];  
  35.       
  36.     //设置斜体字  
  37. //    CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName, 14, NULL);  
  38. //    [mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];  
  39.       
  40.     //设置下划线  
  41. //    [mabString addAttribute:(id)kCTUnderlineStyleAttributeName value:[NSNumber numberWithInt:kCTUnderlineStyleDouble] range:range];  
  42.       
  43. //    //设置字体间距  
  44. //    long margin = 10;  
  45. //    CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &margin);  
  46. //    [mabString addAttribute:(id)kCTKernAttributeName value:(__bridge id)number range:range];  
  47.   
  48.     //设置字体颜色  
  49.     [mabString addAttribute:(id)kCTForegroundColorAttributeName value:[UIColor redColor] range:range];  
  50.       
  51.     //设置字体颜色为前影色  
  52. //    CFBooleanRef flag = kCFBooleanTrue;  
  53. //    [mabString addAttribute:(id)kCTForegroundColorFromContextAttributeName value:(__bridge id)flag range:range];  
  54.       
  55.     //设置空心字  
  56.     long number= 2;  
  57.     CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);  
  58.     [mabString addAttribute:(id)kCTStrokeWidthAttributeName value:(__bridge id)num range:NSMakeRange(0, str.length)];  
  59.     //设置空心字颜色  
  60.     [mabString addAttribute:(id)kCTStrokeColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, str.length)];  
  61.       
  62.     //2.3结束编辑  
  63.     [mabString endEditing];  
  64.       
  65.     //3.生成CTFramesetter  
  66.     CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)mabString);  
  67.       
  68.     //4.得到CTFrame  
  69.     //4.1创建路径  
  70.     CGMutablePathRef path = CGPathCreateMutable();  
  71.     //4.2添加路径  
  72.     CGPathAddRect(path, NULL, CGRectMake(100self.bounds.size.width - 20self.bounds.size.height));  
  73.     //获得CTFrame  
  74.     CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(00), path, NULL);  
  75.       
  76.     //5.绘制(CTFrameDraw)  
  77.     //5.1获取上下文  
  78.     CGContextRef context = UIGraphicsGetCurrentContext();  
  79.     //5.2设置文本矩阵  
  80.     CGContextSetTextMatrix(context, CGAffineTransformIdentity);  
  81.     //压栈,压入图形状态栈中.每个图形上下文维护一个图形状态栈,并不是所有的当前绘画环境的图形状态的元素都被保存。图形状态中不考虑当前路径,所以不保存  
  82.     //5.3保存现在得上下文图形状态。不管后续对context上绘制什么都不会影响真正得屏幕  
  83.     CGContextSaveGState(context);  
  84.     //x,y轴方向移动  
  85.     CGContextTranslateCTM(context, 0self.bounds.size.height);  
  86.     //缩放x,y轴方向缩放,-1.0为反向1.0倍,坐标系转换,沿x轴翻转180度  
  87.     CGContextScaleCTM(context, 1.0, -1.0);  
  88.       
  89.     CTFrameDraw(frame, context);  
  90.       
  91.     //6.释放  
  92.     CGPathRelease(path);  
  93.     CFRelease(framesetter);  
  94.       
  95. }  
  96.   
  97. @end  
[objc]  view plain  copy
  1. /* 
  2.  通常处理步聚: 
  3.   
  4.  1.使用core text就是先有一个要显示的string,然后定义这个string每个部分的样式->attributedString -> 生成 CTFramesetter -> 得到CTFrame -> 绘制(CTFrameDraw) 
  5.  其中可以更详细的设置换行方式,对齐方式,绘制区域的大小等。 
  6.  2.绘制只是显示,点击事件就需要一个判断了。 
  7.  CTFrame 包含了多个CTLine,并且可以得到各个line的其实位置与大小。判断点击处在不在某个line上。CTLine 又可以判断这个点(相对于ctline的坐标)处的文字范围。然后遍历这个string的所有NSTextCheckingResult,根据result的rang判断点击处在不在这个rang上,从而得到点击的链接与位置。 
  8.  */  

举例说明:

[objc]  view plain  copy
  1. //设置字体属性  
  2. CTFontRef font = CTFontCreateWithName(CFSTR("Georigia"), 40NULL);  
  3. [mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];  

[objc]  view plain  copy
  1. //设置斜体字  
  2. CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName14NULL);  
  3. [mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];  

[objc]  view plain  copy
  1. //设置下划线  
  2. [mabString addAttribute:(id)kCTUnderlineStyleAttributeName value:[NSNumber numberWithInt:kCTUnderlineStyleDouble] range:range];  

[objc]  view plain  copy
  1. //设置字体间距  
  2. long margin = 10;  
  3. CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &margin);  
  4. [mabString addAttribute:(id)kCTKernAttributeName value:(__bridge id)number range:range];  

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


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

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



详细代码:

.h文件

[objc]  view plain  copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface HSCoreTextView : UIView  
  4.   
  5. @end  

.m文件

[objc]  view plain  copy
  1. #import "HSCoreTextView.h"  
  2. #import <CoreText/CoreText.h>  
  3.   
  4. /* 
  5.  通常处理步聚: 
  6.   
  7.  1.使用core text就是先有一个要显示的string,然后定义这个string每个部分的样式->attributedString -> 生成 CTFramesetter -> 得到CTFrame -> 绘制(CTFrameDraw) 
  8.  其中可以更详细的设置换行方式,对齐方式,绘制区域的大小等。 
  9.  2.绘制只是显示,点击事件就需要一个判断了。 
  10.  CTFrame 包含了多个CTLine,并且可以得到各个line的其实位置与大小。判断点击处在不在某个line上。CTLine 又可以判断这个点(相对于ctline的坐标)处的文字范围。然后遍历这个string的所有NSTextCheckingResult,根据result的rang判断点击处在不在这个rang上,从而得到点击的链接与位置。 
  11.  */  
  12.   
  13. @implementation HSCoreTextView  
  14.   
  15. - (void)drawRect:(CGRect)rect  
  16. {  
  17.     [self characterAttribute];  
  18. }  
  19.   
  20. - (void)characterAttribute  
  21. {  
  22.     //1.创建NSMutableAttributedString  
  23.     NSString *str = @"Most want is you,the most do not want to bother is also you.最想的是你,最不想打扰的也是你.";  
  24.     NSMutableAttributedString *mabString = [[NSMutableAttributedString alloc] initWithString:str];  
  25.       
  26.     //2.定义样式  
  27.     //2.1开始编辑  
  28.     [mabString beginEditing];  
  29.     NSRange range = NSMakeRange(04);  
  30.       
  31.     //2.2样式设置  
  32.     //设置字体属性  
  33. //    CTFontRef font = CTFontCreateWithName(CFSTR("Georigia"), 40, NULL);  
  34. //    [mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];  
  35.       
  36.     //设置斜体字  
  37. //    CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName, 14, NULL);  
  38. //    [mabString addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:range];  
  39.       
  40.     //设置下划线  
  41. //    [mabString addAttribute:(id)kCTUnderlineStyleAttributeName value:[NSNumber numberWithInt:kCTUnderlineStyleDouble] range:range];  
  42.       
  43. //    //设置字体间距  
  44. //    long margin = 10;  
  45. //    CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &margin);  
  46. //    [mabString addAttribute:(id)kCTKernAttributeName value:(__bridge id)number range:range];  
  47.   
  48.     //设置字体颜色  
  49.     [mabString addAttribute:(id)kCTForegroundColorAttributeName value:[UIColor redColor] range:range];  
  50.       
  51.     //设置字体颜色为前影色  
  52. //    CFBooleanRef flag = kCFBooleanTrue;  
  53. //    [mabString addAttribute:(id)kCTForegroundColorFromContextAttributeName value:(__bridge id)flag range:range];  
  54.       
  55.     //设置空心字  
  56.     long number= 2;  
  57.     CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);  
  58.     [mabString addAttribute:(id)kCTStrokeWidthAttributeName value:(__bridge id)num range:NSMakeRange(0, str.length)];  
  59.     //设置空心字颜色  
  60.     [mabString addAttribute:(id)kCTStrokeColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, str.length)];  
  61.       
  62.     //2.3结束编辑  
  63.     [mabString endEditing];  
  64.       
  65.     //3.生成CTFramesetter  
  66.     CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)mabString);  
  67.       
  68.     //4.得到CTFrame  
  69.     //4.1创建路径  
  70.     CGMutablePathRef path = CGPathCreateMutable();  
  71.     //4.2添加路径  
  72.     CGPathAddRect(path, NULL, CGRectMake(100self.bounds.size.width - 20self.bounds.size.height));  
  73.     //获得CTFrame  
  74.     CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(00), path, NULL);  
  75.       
  76.     //5.绘制(CTFrameDraw)  
  77.     //5.1获取上下文  
  78.     CGContextRef context = UIGraphicsGetCurrentContext();  
  79.     //5.2设置文本矩阵  
  80.     CGContextSetTextMatrix(context, CGAffineTransformIdentity);  
  81.     //压栈,压入图形状态栈中.每个图形上下文维护一个图形状态栈,并不是所有的当前绘画环境的图形状态的元素都被保存。图形状态中不考虑当前路径,所以不保存  
  82.     //5.3保存现在得上下文图形状态。不管后续对context上绘制什么都不会影响真正得屏幕  
  83.     CGContextSaveGState(context);  
  84.     //x,y轴方向移动  
  85.     CGContextTranslateCTM(context, 0self.bounds.size.height);  
  86.     //缩放x,y轴方向缩放,-1.0为反向1.0倍,坐标系转换,沿x轴翻转180度  
  87.     CGContextScaleCTM(context, 1.0, -1.0);  
  88.       
  89.     CTFrameDraw(frame, context);  
  90.       
  91.     //6.释放  
  92.     CGPathRelease(path);  
  93.     CFRelease(framesetter);  
  94.       
  95. }  
  96.   
  97. @end  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值