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. 简单示例

    NSString *str = @"This is a test of characterAttribute. 中文字符";
NSMutableAttributedString *mabstring = [[NSMutableAttributedString alloc]initWithString:str]; [mabstring beginEditing]; //对同一段字体进行多属性设置
//红色
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)[UIColor redColor].CGColor forKey:(id)kCTForegroundColorAttributeName];
//斜体
CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:].fontName, , NULL);
[attributes setObject:(id)font forKey:(id)kCTFontAttributeName];
//下划线
[attributes setObject:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] forKey:(id)kCTUnderlineStyleAttributeName]; [mabstring addAttributes:attributes range:NSMakeRange(, )]; NSRange kk = NSMakeRange(, ); NSDictionary * dc = [mabstring attributesAtIndex: effectiveRange:&kk]; [mabstring endEditing];


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

2.2.  图文混排的实现

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

  步骤;

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

2.2.1. s

最新文章

  1. PowerDesigner(数据建模)使用大全
  2. 如何给input[file]定义cursor
  3. ECMall如何支持SSL连接邮件服务器的配置
  4. [HDU 1114] Piggy-Bank (动态规划)
  5. jquery.fullCalendar官方文档翻译(一款小巧好用的日程管理日历, 可集成Google Calendar)
  6. poj2373
  7. C++ 檔案、資料夾、路徑處理函式庫:boost::filesystem
  8. 《实验数据的结构化程序设计》 2.4.4Calendar个人意见,寻求指引
  9. 第三记“晋IT”分享成长沙龙
  10. The openssl extension is required for SSL/TLS protection but is not available
  11. Kotlin 条件控制
  12. [JS] ECMAScript 6 - Object : compare with c#
  13. 安全易用的云许可-VirboxLM许可管理平台
  14. 使用Groovy+Spock构建可配置的订单搜索接口测试用例集
  15. python 函数返回值笔记
  16. Codeforces 295 B. Greg and Graph
  17. IOC疑惑
  18. MUI事件管理
  19. MFC中利用GDI+进行双缓冲作图的有关设置
  20. Maven编译Java程序配置

热门文章

  1. C# 经典入门15章 RichTextBox
  2. 生成makefile文件编译源文件
  3. Firebug Console 与命令行全集
  4. Android——apk反编译
  5. 使用bootstrap响应式布局——手机屏幕中横向滚动显示标签页选项
  6. SqlServer tsql语句大全
  7. 电池和Adapter切换电路改进实验(转)
  8. Nginx 负载均衡 后端服务器获取前端用户真实IP
  9. iOS探究UITableView的内部代码,仿UITableView自定义
  10. ios系统 ipa文件 打包流程详解 及 常见问题处理