1. 基础概念

1.1. 字体(Font)

  同一大小、同一样式的字形的集合。

1.2. 字符(Character)

  字符表示信息本身,一般指某种编码,如Unicode编码。

1.3. 字形(Glyphs)

  字符+字体就会有个对应的图片,这个图片就是字形。

1.3. 字形描述集(Glyphs Metris)

  字形的各个参数:

  • 边框(Bounding Box):一个假想的边框,尽可能地容纳整个字形。
  • 基线(Baseline):一条假想的参照线,以此为基础进行字形的渲染。一般来说是一条横线。
  • 基础原点(Origin):基线上最左侧的点。
  • 行间距(Leading):行与行之间的间距。
  • 字间距(Kerning):字与字之间的距离,为了排版的美观,并不是所有的字形之间的距离都是一致的,但是这个基本步影响到我们的文字排版。
  • 上行高度(Ascent)和下行高度(Decent):一个字形最高点和最低点到基线的距离,前者为正数,而后者为负数。当同一行内有不同字体的文字时,就取最大值作为相应的值。

  lineHeight = Ascent + |Decent| + Leading

2. Core Text

  原来 CGContextDrawText 被废弃掉了,现在使用 Core Text 绘制文本和图片。

  参考:http://www.cocoachina.com/industry/20140521/8504.html

  参考:http://blog.csdn.net/fengsh998/article/details/8691823

2.1. 基础概念

  绘图接口有:CTFrameDraw 和 CTLineDraw。

2.1.1. NSAttributedString

  从字面上就可以理解:包含了属性的NSString。具有的属性:粗/斜体、下划线、颜色、背景灯。每个属性都可以设置到一个字符区域范围上。

2.1.2. CTFrameSetter

  由 CTFramesetter 根据参数 CGPath 生成 CTFrame。

2.1.3. CTFrame

  CTFrame 由一行一行的 CTLine 组成,每个 CTLine 包含很多 CTRun 。CTRun是字形绘制的最小单位。

2.1.4. 简单示例

  1. NSString *str = @"This is a test of characterAttribute. 中文字符";
  2. NSMutableAttributedString *mabstring = [[NSMutableAttributedString alloc]initWithString:str];
  3.  
  4. [mabstring beginEditing];
  5.  
  6. //对同一段字体进行多属性设置
  7. //红色
  8. NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)[UIColor redColor].CGColor forKey:(id)kCTForegroundColorAttributeName];
  9. //斜体
  10. CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:].fontName, , NULL);
  11. [attributes setObject:(id)font forKey:(id)kCTFontAttributeName];
  12. //下划线
  13. [attributes setObject:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] forKey:(id)kCTUnderlineStyleAttributeName];
  14.  
  15. [mabstring addAttributes:attributes range:NSMakeRange(, )];
  16.  
  17. NSRange kk = NSMakeRange(, );
  18.  
  19. NSDictionary * dc = [mabstring attributesAtIndex: effectiveRange:&kk];
  20.  
  21. [mabstring endEditing];


  22. CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)mabstring);
  23.  
  24. CGMutablePathRef Path = CGPathCreateMutable();
  25.  
  26. CGPathAddRect(Path, NULL ,CGRectMake( , ,self.bounds.size.width- , self.bounds.size.height-));
  27.  
  28. CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(, ), Path, NULL);
  29.  
  30. //获取当前(View)上下文以便于之后的绘画,这个是一个离屏。
  31. CGContextRef context = UIGraphicsGetCurrentContext();
  32.  
  33. CGContextSetTextMatrix(context , CGAffineTransformIdentity);
  34.  
  35. //压栈,压入图形状态栈中.每个图形上下文维护一个图形状态栈,并不是所有的当前绘画环境的图形状态的元素都被保存。图形状态中不考虑当前路径,所以不保存
  36. //保存现在的上下文图形状态。不管后续对context上绘制什么都不会影响真正得屏幕。
  37. CGContextSaveGState(context);
  38.  
  39. //x,y轴方向移动
  40. CGContextTranslateCTM(context , ,self.bounds.size.height);
  41.  
  42. //缩放x,y轴方向缩放,-1.0为反向1.0倍,坐标系转换,沿x轴翻转180度
  43. CGContextScaleCTM(context, 1.0 ,-1.0);
  44.  
  45. CTFrameDraw(frame,context);
  46.  
  47. CGPathRelease(Path);
  48. CFRelease(framesetter);

2.2.  图文混排的实现

  CoreText 不能绘制图片,而是给图片预留位置,最终由 CoreGraphics完成绘制。

  步骤;

  1. 设置某区域的 AttributedString 为 kCTRunDelegateAttributedString
  2. 根据上步设置生成CTRun
  3. 在CTRun的回调获取信息
  4. 通过CoreGraphics绘图。

2.2.1. s

Quartz2D 之 绘制文本的更多相关文章

  1. html5 canvas 笔记三(绘制文本和图片)

    绘制文本 fillText(text, x, y [, maxWidth])   在指定的(x,y)位置填充指定的文本,绘制的最大宽度是可选的. strokeText(text, x, y [, ma ...

  2. FontMetrics ----- 绘制文本,获取文本高度

    Canvas 绘制文本时,使用FontMetrics对象,计算位置的坐标. public static class FontMetrics { /** * The maximum distance a ...

  3. 使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容

    原文:使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容 第一次在CNBlogs上发Post是提出一个有关使用WebBrowser控件时对SELECT网页元素操作的疑惑,这个问题至今也 ...

  4. 使用GDI绘制文本

    /// <summary>        /// 定义一个绘制文本        /// </summary>        public void Texts()       ...

  5. 『备注』GDI+ 绘制文本有锯齿,透明背景文本绘制

    背景: GDI+ 绘制文本 时,如果 背景是透明的 —— 则会出现 锯齿. //其实,我不用这三个 属性 好多年了 //而且,这三个属性 在关键时刻还有可能 帮倒忙 //关键是:这三个属性,鸟用都没有 ...

  6. Javascript高级编程学习笔记(88)—— Canvas(5)绘制文本

    绘制文本 同样的,canvas也为绘制文本提供了相应的方法. 2D上下文提供的文本绘制方法主要有两个: fillText() strokeText() 这两个方法都接受四个参数 要绘制的文本字符串 绘 ...

  7. Win32汇编学习(5):绘制文本2

    这次我们将学习有关文本的诸多属性如字体和颜色等. 理论: Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色.如果您想指定一种颜色就必须给该颜色赋相关的 RGB ...

  8. Win32汇编学习(4):绘制文本

    这次,我们将学习如何在窗口的客户区"绘制"字符串.我们还将学习关于"设备环境"的概念. 理论: "绘制"字符串 Windows 中的文本是一 ...

  9. Qt绘制文本一

    QPainterPath,使用 drawText且设置字体,再使用painter.drawText方式 效果图: void WgtText::paintEvent(QPaintEvent *event ...

随机推荐

  1. 几种在shell命令行中过滤adb logcat输出的方法

    我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adblog ...

  2. 加工生产调度(prod)

    加工生产调度(prod) 题目描述 有n个部件需在A.B机器上加工,每个工件都必须经过先A后B两道工序. 已知:部件i在A.B机器上的加工时间分别为ai,bi. 问:如何安排n个工件的加工顺序,才能使 ...

  3. http 安全验证

    今天升级Xcode 7.0 bata发现网络访问失败.输出错误信息 The resource could not be loaded because the App Transport Securit ...

  4. 只有mdf 没有 日志 恢复数据库

    1.先建一个与你要恢复的数据库名称一样的数据库.2.停止sql server,把你的数据库替换这个数据库.3.重启sql server,把数据库设置为紧急状态.  sp_configure 'allo ...

  5. rsa or dsa?

    http://www.linuxquestions.org/questions/linux-security-4/which-is-better-rsa-or-dsa-public-key-12593 ...

  6. javascript 中this的使用场景全

    1. global this 2.function this 3.prototype this 4. object this 5.DOM this 6 HTML this 7 override thi ...

  7. smali插入log,打印变量

    一:Log打印变量: Log打印字符串: #liyanzhong debug const-string v1, "TAG" const-string v2, "xunbu ...

  8. php new self 详解(转)

    self points to the class in which it is written. So, if your getInstance method is in a class name M ...

  9. 完美解决ie浏览器location.href不刷新页面的问题,进入页面只刷新一次

    /* ie不刷新列表bug */try{ var agent = navigator.userAgent.toLowerCase(); var ieflag = /(msie\s|trident.*r ...

  10. tooltip 鼠标移动上去出现图片或文字与title大同小异

    代码如下: <script type="text/javascript" src="jquery-1.3.2.min.js"></script ...