富文本绘制 之Quartz 2D

    NSString *title =[NSString stringWithFormat:@"%@",@"绘制文字"];
    NSDictionary *titDic = @{NSForegroundColorAttributeName:[UIColor redColor],
                             NSFontAttributeName:[UIFont systemFontOfSize:14.0]
    };
    //富文本样式
    NSMutableAttributedString *attributeTitle = [[NSMutableAttributedString alloc] initWithString:title attributes:titDic];
    //设置frame
    CTFramesetterRef titFrameSetterRef = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributeTitle);
    
    //获取绘制高度
    CGFloat viewW = self.view.bounds.size.width;
    CGSize reSize = CGSizeMake(viewW, 10000); //预估的绘制范围,但是 hight=10000 必须是具体的数值,系统可以形成一个具体的矩形块,否则高度会不准
    //绘制的尺寸
    CGSize titSize = CTFramesetterSuggestFrameSizeWithConstraints(titFrameSetterRef, CFRangeMake(0, 0), NULL, reSize, NULL);

    CGRect titRect = CGRectMake(0, 0, viewW, titSize.height);
    //绘制路径
    CGPathRef titPathRef = CGPathCreateWithRect(titRect, NULL);
    CTFrameRef frameRef = CTFramesetterCreateFrame(titFrameSetterRef, CFRangeMake(0, 0), titPathRef, NULL);

    //获取画布
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    CGContextSetTextMatrix(contextRef, CGAffineTransformIdentity);
    
    //坐标系转换 绘制的时候 CT是以左上角为原点(0,0) Y轴向下 设备显示Y轴向上所以要改变坐标系
    
    //平移坐标系 x轴平移0 y轴平移titSize.height
    CGContextTranslateCTM(contextRef, 0, titSize.height);
    
    //缩放坐标轴 x轴方向缩放1.0 y轴缩放-1.0 即x坐标乘1.0 y坐标乘-1.0 坐标轴是反转的
    CGContextScaleCTM(contextRef, 1.0, -1.0);

    //绘制文字
    CTFrameDraw(frameRef, contextRef);

    //释放创建的对象
    CFRelease(titFrameSetterRef);
    CGPathRelease(titPathRef);
    CFRelease(frameRef);

//还有旋转坐标系
- void CGContextRotateCTM ( CGContextRef c, CGFloat angle ):旋转坐标系统。

该方法控制坐标系统旋转 angle 弧度。在缩放后的坐标系统上绘制图形时,所有坐标点的 X、Y 坐标都相当于旋转了 angle弧度之后的坐标。
为了让开发者在进行坐标变换时无须计算多次坐标变换后的累加结果,Quartz 2D还提供了如下两个方法来保存、恢复绘图状态。
- void CGContextSaveGState ( CGContextRef c ):保存当前的绘图状态。 
- void CGContextRestoreGState ( CGContextRef c ):恢复之前保存的绘图状态。

需要说明的是,CGContextSaveGState() 函数保存的绘图状态,不仅包括当前坐标系统的状态,也包括当前设置的填充风格、线条风格、阴影风格等各种绘图状态。但 CGContextSaveGState() 函数不会保存当前绘制的图形。

这些基本够平时使用的

你可能感兴趣的:(富文本绘制 之Quartz 2D)