TextKit

TextKit 的基本介绍

TextKit is a full-featured, high-level set of classes for handling text and fine typography. Using TextKit, you can lay out styled text into paragraphs, columns, and pages; you can flow text around arbitrary regions such as graphics; and you can use it to manage multiple fonts. If you were considering using Core Text to implement text rendering, you should consider TextKit instead. TextKit is integrated with all UIKit text-based controls to enable apps to create, edit, display, and store text more easily—and with less code than was previously possible in iOS.
TextKit是一个全功能的,高级组类来处理文字和排版。使用TextKit,您可以列出样式文本段落,列,和页面,你可以在任意流文本区域如图形;你可以用它来管理多个字体。如果你正在考虑使用核心文本实现文本渲染,你应该考虑TextKit代替。TextKit是结合所有UIKit文本控件启用应用程序来创建、编辑、显示和存储文本更多地被抛弃在iOS比以前更少的代码。

TextKit comprises new UIKit classes, along with extensions to existing classes, including the following:
TextKit包含新的UIKit类,扩展现有的类,包括以下:

The NSAttributedString class has been extended to support new attributes.
已经扩展为支持新属性

The NSLayoutManager class generates glyphs and lays out text.
生成符号和列出了文本

The NSTextContainer class defines a region where text is laid out.
定义了一个文本布局区域

The NSTextStorage class defines the fundamental interface for managing text-based content.
定义了基本的界面来管理基于文本的内容。

For more information about TextKit, see Text Programming Guide for iOS.
更多的信息请查看 TextKit Text Programming Guide for iOS

TextKit的架构分析

TextKit 架构示意图

TextKit 是apple 在iOS7 中引入的。是一个开速而且现代化的文字排版和渲染引擎。
TextKit 的引入主要是为了减小图文混排的难度。

复杂的 图文混排必须使用 CoreText 来实现。TextKit 是 CoreText 的封装。

可以从图中看出,原生的文本控件都是构建在TextKit之上的,使用TextKit进行排版和渲染。而UIWebView是构建在WebKit上的,不能使用TextKit功能。

TextKit的作用

两个最重要的功能:

  • 文字排版
  • 文字渲染

Text Kit中重要的一些对象

textkitarchitecture_2x.png
  • TextView: 主要是指 UILable, UITextField, UITextView。 主要是 UITextView
  • TextContainer: 对应 TextKit 中的 NSTextContainer ,NSTextContainer 定义的是一块可以排版的区域。(一般是矩形区域,也可以自己定制,圆, 椭圆)
  • Layout manager: 对应着 NSLayoutManager。主要是用来处理文字的排版工作。—— 通过将 TextStorage 存储的文字信息按照规范显示到对应的 TextContainers 区域。
  • **Textstorage: ** 对应着 NSTextStorage 类,定义了一些基本的存储机制。用来存储文本和文本相关的属性。存储的信息发送变化的时候,通知布局对象进行布局调整。

** NSTextStorage NSLayoutManager NSTextContainer 的对应关系**

一一对应


4196_131113102852_1.jpg

将文字显示为多列,或多页

4196_131113102904_1.jpg

不同的排版方式,则可以使用多个NSLayoutManager

4196_131113102915_1.jpg

** 排版渲染实现的过程 **
通过形象的方式,对UITextView的组成做了分解。通常,我们在设备上只能看到最右边的文本显示界面,而内部的 NSTextStorage、NSLayoutManager 和 NSTextContainer 是看不出来的。通常由NSLayoutManager 从 NSTextStorage 中读取出文本数据,然后根据一定的排版方式,将文本排版到NSTextContainer中,再由NSTextContainer结合UITextView将最终效果显示出来。

4196_131113102949_1.jpg

注意点
Text Kit 是基于 Core Text 构建的快速、先进的文本排版和渲染引擎,并且与UIKit很好的集合。UITextView,UITextField、UILabel 都已经基于Text Kit 重新构建,所以它们都支持分页文本、文本包装、富文本编辑、交互式文本着色、文本折叠和自定义截取等特性。所有这些UI控件现在都以同样的方式构建,在它们后面,一个NSTextStorage对象保存着文本的主要信息,它本身是 NSMutableAttributedString 的子类,支持分批编辑。这就意味着你可以改变一个范围内的字符的样式而不用整体替换文本内容。

self.textView.textStorage.beginEditing()

// 在这中间修改部分内容
//  self.mark(Word:"Alice" inTextStorage: self.textView.textStorage)

self.textView.textStorage.endEditing()

Text storage管理者一系列的NSLayoutManager对象。
当它的字符或者属性改变时会通知到自己所管理的layout Manager对象以便它们作出相应的反应。在layout manager上面是一个NSTextContainer对象,用于为layout manager定义坐标系和一些几何特性。例如,如果你想UITextView中的文本环绕在一张图片四周,你可以给text container设定一个排除路径(exclusion path)。

UIBezierPath *exclusion = ButterflyBezierPath; 
self.textView.textContainer.exclusionPaths = @[exclusion]; 
4196_131028122737_1.png

Text container能够处理击中测试(hit tests),所以可以定位到点击的字符在文本中的位置。 此外它还提供一些代理方法让开发者能够自己定义链接点击后的处理事件。

Text Kit下面四个特性
动态字体(Dynamic type)

动态字体是iOS7中新增加的比较重要的特性之一,程序应该按照用户设定的字体大小和粗细来显示文本内容。
分别在设置\通用\辅助功能和设置\通用\文字大小中可以设置文本在应用程序中显示的粗细和大小。

4196_131028122854_1-2.jpg

iOS7对系统字体在显示上做了一些优化,让不同大小的字体在屏幕上都能清晰的显示。通常用户设置了自己偏好的字体,他们希望在所有程序中都看到文本显示是根据他们的设定进行调整。为了实现这个,开发者需要在自己的应用中给文本控件设置当前用户设置字体,而不是指定死字体及大小。可以通过UIFont中新增的preferredFontForTextStyle:方法来获取用户偏好的字体。

iOS7中给出了6中字体样式供选择:
UIFontTextStyleHeadline
UIFontTextStyleBody
UIFontTextStyleSubheadline
UIFontTextStyleFootnote
UIFontTextStyleCaption1
UIFontTextStyleCaption2


4196_131028122930_1.png

为了让我们的程序支持动态字体,需要按一下方式给文本控件(通常是指UILabel,UITextField,UITextView)设定字体:

self.textView.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 

这样设置之后,文本控件就会以用户设定的字体大小及粗细显示,但是如果程序在运行时,用户切换到设置里修改了字体,这是在切回程序,字体并不会自动跟着变。这时就需要我们自己来更新一下控件的字体了。

在系统字体修改时,系统会给运行中的程序发送UIContentSizeCategoryDidChangeNotification通知,我们只需要监听这个通知,并重新设置一下字体即可。

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(preferredContentSizeChanged:) 
    name:UIContentSizeCategoryDidChangeNotification 
    object:nil]; 
- (void)preferredContentSizeChanged:(NSNotification *)notification{ 
    self.textView.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 
} 

当然,有的时候要适应动态修改的字体并不是这么设置一下就完事了,控件的大小可能也需要进行相应的调整,这时我们程序中的控件大小也不应该写死,而是需要根据字体大小来计算.

凸版印刷体效果(Letterpress effects)

凸版印刷替效果是给文字加上奇妙阴影和高光,让文字看起有凹凸感,像是被压在屏幕上。当然这种看起来很高端大气上档次的效果实现起来确实相当的简单,只需要给AttributedString加一个NSTextEffectAttributeName属性,并指定该属性值为NSTextEffectLetterpressStyle就可以了。

iOS 7 教程:浅析Text Kit
Text Kit学习(入门和进阶)
字符串渲染

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容