IOS CoreText系列二:简单使用

前言:上文主要针对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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值