富文本使用案例:html
這裏我本身也用了富文本實現了簡單的卻也是經常使用的例子:git
對於最後面的¥50中劃線這種設置,估計只有富文本最好用了。github
然而這些控件自己對文本的展示方式很單一,一般僅僅可以控制字體樣式、大小、顏色、加粗、斜體等等,而對於行距控制,字距控制,段落控制等高級功能卻無能爲力。編程
此時難免要提起一個很是強大的文本排版框架CoreText.framework。瀏覽器
CoreText框架是基於 iOS 3.2+ 和 OSX 10.5+ 的一種可以對文本格式和文本佈局進行精細控制的文本引擎。它良好的結合了 UIKit 和 Core Graphics/Quartz:app
UIKit 的 UILabel 容許你經過在 IB 中簡單的拖曳添加文本,但你不能改變文本的顏色和其中的單詞。框架
Core Graphics/Quartz幾乎容許你作任何系統容許的事情,但你須要爲每一個字形計算位置,並畫在屏幕上。工具
CoreText正結合了這二者!你本身能夠徹底控制位置、佈局、相似文本大小和顏色這樣的屬性,CoreText將幫你完善其它的東西??相似文本換行、字體呈現等等。佈局
然而,CoreText.framework自己很是龐大,學習成本較高,使用起來也不是很方便,因此通常不是特殊須要,不多會有人去使用它。性能
隨 着iOS6 API的發佈,文字顯示的API愈來愈完善,其中一個重要的更新是在UITextField,UITextView和UILabel中加入了對 AttributedString的支持,實現行距控制,字距控制,段落控制等高級功能也沒必要再去使用深奧的CoreText框架。
而iOS7的發佈,蘋果又引入了TextKit,TextKit是一個快速而又現代化的文字排版和渲染引擎。
TextKit並無新增類,只是在原有的文本顯示控件上進行了封裝,能夠在平時咱們最喜歡使用的UILabel,UITextField,UITextView等控件裏面使用,其最主要的做用就是爲程序提供文字排版和渲染的功能。
蘋 果引入TextKit的目的並不是要取代已有的CoreText框架,雖然CoreText的主要做用也是用於文字的排版和渲染,但它是一種先進而又處於底 層技術,若是咱們須要將文本內容直接渲染到圖形上下文(Graphics context)時,從性能和易用性來考慮,最佳方案就是使用CoreText。而若是咱們須要直接利用蘋果提供的一些控件(如UITextView、 UILabel和UITextField等)對文字進行排版,那麼藉助於UIKit中TextKit提供的API無疑更爲方便快捷。
TextKit在文字處理方面具備很是強大的功能,而且開發者能夠對TextKit進行定製和擴展。據悉,蘋果利用了2年的時間來開發TextKit,相信這對許多開發者來講都是福音。
富文本基本使用方法的思路概要
一、建立一個NSMutableAttributedString富文本對象(通常不用NSAttributedString) 二、設置addAttribute屬性 (1) addAttribute: 一個屬性 (2) addAttributes: 一個存儲多個屬性的屬性字典,好比這個字典能夠是: NSDictionary *attrDic = @{ NSFontAttributeName: [UIFont fontWithName: @"Zapfino" size: 15], NSForegroundColorAttributeName: [UIColor blueColor] }; 三、控件.attributedText = 富文本對象(和控件.txt = NSString文本對象不同的)
示例富文本使用過程:
其中AttributedString究竟能夠設置哪些屬性,具體來講,有如下21個:
NSFontAttributeName 設置字體屬性,默認值:字體:Helvetica(Neue) 字號:12 NSForegroundColorAttributeNam 設置字體顏色,取值爲 UIColor對象,默認值爲黑色 NSBackgroundColorAttributeName 設置字體所在區域背景顏色,取值爲 UIColor對象,默認值爲nil, 透明色 NSLigatureAttributeName 設置連體屬性,取值爲NSNumber 對象(整數),0 表示沒有連體字符,1 表示使用默認的連體字符 NSKernAttributeName 設定字符間距,取值爲 NSNumber 對象(整數),正值間距加寬,負值間距變窄 NSStrikethroughStyleAttributeName 設置刪除線,取值爲 NSNumber 對象(整數) NSStrikethroughColorAttributeName 設置刪除線顏色,取值爲 UIColor 對象,默認值爲黑色 NSUnderlineStyleAttributeName 設置下劃線,取值爲 NSNumber 對象(整數),枚舉常量 NSUnderlineStyle中的值,與刪除線相似 NSUnderlineColorAttributeName 設置下劃線顏色,取值爲 UIColor 對象,默認值爲黑色 NSStrokeWidthAttributeName 設置筆畫寬度,取值爲 NSNumber 對象(整數),負值填充效果,正值中空效果 NSStrokeColorAttributeName 填充部分顏色,不是字體顏色,取值爲 UIColor 對象 NSShadowAttributeName 設置陰影屬性,取值爲 NSShadow 對象 NSTextEffectAttributeName 設置文本特殊效果,取值爲 NSString 對象,目前只有圖版印刷效果可用: NSBaselineOffsetAttributeName 設置基線偏移值,取值爲 NSNumber (float),正值上偏,負值下偏 NSObliquenessAttributeName 設置字形傾斜度,取值爲 NSNumber (float),正值右傾,負值左傾 NSExpansionAttributeName 設置文本橫向拉伸屬性,取值爲 NSNumber (float),正值橫向拉伸文本,負值橫向壓縮文本 NSWritingDirectionAttributeName 設置文字書寫方向,從左向右書寫或者從右向左書寫 NSVerticalGlyphFormAttributeName 設置文字排版方向,取值爲 NSNumber 對象(整數),0 表示橫排文本,1 表示豎排文本 NSLinkAttributeName 設置連接屬性,點擊後調用瀏覽器打開指定URL地址 NSAttachmentAttributeName 設置文本附件,取值爲NSTextAttachment對象,經常使用於文字圖片混排 NSParagraphStyleAttributeName 設置文本段落排版格式,取值爲 NSParagraphStyle 對象
關於屬性的具體如何使用,對於不熟悉的屬性能夠經過搜索引擎瞭解。
還能夠直接到UIKIt框架底層去查詢:
注意:是UIKit框架下的NSAttributedString.h,而不是Foundation框架下的NSAttributedString.h去查,Foundation框架下雖然有NSAttributedString.h,可是Foundation框架沒有關於富文本全部的key,並且和UIKit徹底不同的工具類。
寫出思路:
根據NSMutableAttributedString的基本使用,咱們每次須要設置富文本,都須要建立NSMutableAttributedString並調用相同的add...方法。 那麼,就能夠先建立一個類,並把這個add...方法抽離出來放進這個類中,相似MVC的抽離模型數據對象。 這個類是屬性模型對象,而不是數據模型對象哦。說法不一,但本質其實同樣的。
富文本封裝源代碼代碼百度雲(持續更新)下載連接: http://pan.baidu.com/s/1c04YC8o 密碼: 3i7e
首先,關於開源代碼GOBMarkupPaser處理富文本有一個很好的學習博客:http://www.cnblogs.com/YouXianMing/p/4269213.html也是框架原開發者github博文的翻譯。值得英語很差的學習。
github描述的雖然比較多,可是用起來仍是比較容易的。下面只要跑一下程序,源碼中也有demo,先看看源碼運行的程序效果:
由於這個開源代碼GONMarkupParser處理富文本比較方便,因此之後開發項目建議使用。
百度雲下載連接: http://pan.baidu.com/s/1qWnFgQw 密碼: m2pe
什麼是UITextKit?
TextKit是在iOS7中新出的,實現了對CoreText的封裝,使用起來更加方便.
雖然是新出的,但也不表明立馬就能上手-_-!!,TextKit能夠實現圖文混排效果,很好用.
實現的過程以下:
storage --> layoutManager --> textContainer --> textView
這.....顯示一串文本就要作這麼多的事情.....
一下圖中代碼實例是實現 高亮某些文本:
詳細UIKit的學習請參考:http://www.cnblogs.com/YouXianMing/p/3767905.html 以及參考後續的博文。
何時使用UITextKit?
圖文混排,但並非何時要實現圖文混排就要用這個,好比有的app鳳凰新聞客戶端就不是,可是可使用UITextKit實現稍微簡單的圖文混搭的界面。
只須要了解一下有UITextKit這麼個東西,其實這個UITextKit能夠用來實現一個簡易的電子書閱讀器。
1 #import "ViewController.h" 2 #import "ParagraphAttributes+Constructor.h" 3 #import "ExclusionView.h" 4 #import "BookTextView.h" 5 6 #define Width [UIScreen mainScreen].bounds.size.width 7 #define Height [UIScreen mainScreen].bounds.size.height 8 9 @interface ViewController ()<UITextViewDelegate> 10 11 @property (strong, nonatomic) BookTextView *bookView; 12 13 @end 14 15 @implementation ViewController 16 17 - (void)viewDidLoad { 18 [super viewDidLoad]; 19 20 21 // 讀取文本 22 NSString *text = [NSString stringWithContentsOfFile:[NSBundle.mainBundle URLForResource:@"lorem" withExtension:@"txt"].path 23 encoding:NSUTF8StringEncoding 24 error:nil]; 25 26 27 // 初始化bookView 28 self.bookView = [[BookTextView alloc] initWithFrame:CGRectMake(10, 10, Width - 20, Height - 20)]; 29 self.bookView.textString = text; 30 31 // 設置段落樣式 32 self.bookView.paragraphAttributes = [ParagraphAttributes qingKeBengYue]; 33 34 // 設置富文本 35 self.bookView.attributes = @[[ConfigAttributedString foregroundColor:[[UIColor blackColor] colorWithAlphaComponent:0.75f] 36 range:NSMakeRange(0, 9)], 37 [ConfigAttributedString font:[UIFont fontWithName:QingKeBengYue size:22.f] 38 range:NSMakeRange(0, 9)]]; 39 40 // 加載圖片 41 ExclusionView *exclusionView = [[ExclusionView alloc] initWithFrame:CGRectMake(150.f, 195, 320, 150)]; 42 self.bookView.exclusionViews = @[exclusionView]; 43 UIImageView *imageView = [[UIImageView alloc] initWithFrame:exclusionView.bounds]; 44 imageView.image = [UIImage imageNamed:@"demo"]; 45 [exclusionView addSubview:imageView]; 46 47 48 // 構建view 49 [self.bookView buildWidgetView]; 50 [self.view addSubview:self.bookView]; 51 52 53 // 延時0.01s執行 54 [self performSelector:@selector(event) 55 withObject:nil 56 afterDelay:0.01]; 57 } 58 59 - (void)event { 60 [self.bookView moveToTextPercent:0.00]; 61 } 62 63 @end
在使用了UIKit的BookTextView的實例中,由於用到了自定義View,而後須要在自定義View上顯示富文本。因爲富文本的設置能夠由 多個不一樣的屬性值,好比:字體大小,文本前景色,背景色等等,因此須要抽離出來新建一個屬性-值模型對象,每一個對象存儲一種屬性-值,而後在自定義 View中添加property的NSArray,用來存儲和重寫set方法加載傳進來的屬性-值模型對象,而後經過文本對象對應的還未設置屬性可變富文 本對象add這些屬性-值模型對象存儲的值。固然這個BookTextView內部由於用到UIKit因此是經過NSTextStorage *storage經過遍歷方法add加載NSArray對象存儲的屬性-值。
而在HYStringAttribute實例中,由於僅僅 須要直接將NSString對象對應的富文本對象設置屬性,最後添加到Label等控件上顯示,由於考慮到簡易封裝的需求,因此特意將全部的屬性抽象成一 個須要協議約束的抽象類,而後由這個抽象類具體派生出具體的屬性對象,好比Font對象,前景色對象,背景色對象.....這裏只實現了三種,還有不少待 有時間按需求去拓展。具體使用的時候,須要經過類別拓展方法來方便使用:<1>一種是富文本類拓展出方法,這個方法實現經過參數傳入的具體的 屬性對象,而後加載這個對象,設置富文本屬性。<2>一種是NSString類拓展出方法,這個方法直接將自己實例對象self經過富文本創 建和加載經過參數傳入的具體的屬性對象,而後返回設置好富文本屬性的富文本對象。