iOS之UI--富文本總結,iosui--總結

來源:互聯網
上載者:User

iOS之UI--富文本總結,iosui--總結
文章內容大綱

  • 1、NSMutableAttributedString的基本使用
  • 2、NSMutableAttributedString的簡易封裝
  • 3、使用開原始碼GOBMarkupPaser處理富文本
  • 4、UITextKit簡介
  • 5、編程思想的相關思考
前言

富文本使用案例:

這裡我自己也用了富文本實現了簡單的卻也是常用的例子:

                             對於最後面的¥50中劃線這種設定,估計只有富文本最好用了。

 

  • 在IOS或者Mac OS X通過UIKit提供的用來顯示字串控制項有三個:
    • UILable,UITextField,UITextView。

然而這些控制項本身對文本的展現方式很單一,通常僅僅能夠控制字型樣式、大小、顏色、加粗、斜體等等,而對於行距控制,字距控制,段落控制等進階功能卻無能為力。

此時不免要提起一個非常強大的文本排版架構CoreText.framework

CoreText架構是基於 iOS 3.2+ 和 OSX 10.5+ 的一種能夠對文字格式設定和文本布局進行精細控制的文本引擎。它良好的結合了 UIKit 和 Core Graphics/Quartz:

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,相信這對許多開發人員來說都是福音。

 IOS之NSMutableAttributedString 使用詳解1、NSMutableAttributedString的基本使用
  • 富文本注意:
    • 先設定的先顯示,後設定的,如果和先設定的樣式不一致,是會覆蓋的,富文本的設定具有先後順序。
    • 不要忽略了空格也是一個字元。
    • 建議使用靈活的好用的NSMutableAttributedString,不要使用NSAttributedString。

富文本基本使用方法的思路概要

1、建立一個NSMutableAttributedString富文字物件(一般不用NSAttributedString)2、設定addAttribute屬性    (1) addAttribute: 一個屬性    (2) addAttributes: 一個儲存多個屬性的屬性字典,比如這個字典可以是:        NSDictionary *attrDic = @{                 NSFontAttributeName: [UIFont fontWithName: @"Zapfino" size: 15],                                               NSForegroundColorAttributeName: [UIColor blueColor]         }; 3、控制項.attributedText = 富文字物件(和控制項.txt = NSString文字物件不一樣的)

樣本富文本使用過程:

範例程式碼:

View Code

其中AttributedString究竟可以設定哪些屬性,具體來說,有以下21個:

NSFontAttributeName                設定字型屬性,預設值:字型:Helvetica(Neue) 字型大小:12NSForegroundColorAttributeNam      設定字型顏色,取值為 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完全不一樣的工具類。

2、NSMutableAttributedString的簡易封裝

寫出思路:

根據NSMutableAttributedString的基本使用,我們每次需要設定富文本,都需要建立NSMutableAttributedString並調用相同的add...方法。那麼,就可以先建立一個類,並把這個add...方法抽離出來放進這個類中,類似MVC的抽離模型資料對象。這個類是屬性模型對象,而不是資料模型對象哦。說法不一,但本質其實一樣的。

富文本封裝原始碼代碼百度雲(持續更新)下載連結: http://pan.baidu.com/s/1c04YC8o 密碼: 3i7e

 

3、使用開原始碼GOBMarkupPaser處理富文本

首先,關於開原始碼GOBMarkupPaser處理富文本有一個很好的學習部落格:http://www.cnblogs.com/YouXianMing/p/4269213.html也是架構原開發人員github博文的翻譯。值得英語不好的學習。

github描述的雖然比較多,但是用起來還是比較容易的。下面只要跑一下程式,源碼中也有demo,先看看源碼啟動並執行程式效果:

因為這個開原始碼GONMarkupParser處理富文本比較方便,所以以後開發專案提案使用。

百度雲下載連結: http://pan.baidu.com/s/1qWnFgQw 密碼: m2pe

4、UITextKit簡介

什麼是UITextKit?

TextKit是在iOS7中新出的,實現了對CoreText的封裝,使用起來更加方便.

雖然是新出的,但也不代表立馬就能上手-_-!!,TextKit可以實現圖文混排效果,很好用.

實現的過程如下:

storage --> layoutManager --> textContainer --> textView

這.....顯示一串文本就要做這麼多的事情.....

一中代碼執行個體是實現 高亮某些文本:

詳細UIKit的學習請參考:http://www.cnblogs.com/YouXianMing/p/3767905.html  以及參考後續的博文。

 

什麼時候使用UITextKit?

圖文混排,但並不是什麼時候要實現圖文混排就要用這個,比如有的app鳳凰新聞用戶端就不是,但是可以使用UITextKit實現稍微簡單的圖文混搭的介面。

只需要瞭解一下有UITextKit這麼個東西,其實這個UITextKit可以用來實現一個簡易的電子書閱讀器。

  Bezier n. 貝齊爾;貝茲路徑   exclusion n. 拒絕,排除 小項目實現電子書:BookTextView執行個體效果動態圖:小項目實現電子書:BookTextView中的ViewController上的代碼
 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 @end14 15 @implementation ViewController16 17 - (void)viewDidLoad {18     [super viewDidLoad];19     20     21     // 讀取文本22     NSString *text = [NSString stringWithContentsOfFile:[NSBundle.mainBundle URLForResource:@"lorem" withExtension:@"txt"].path23                                                encoding:NSUTF8StringEncoding24                                                   error:nil];25     26     27     // 初始化bookView28     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     // 構建view49     [self.bookView buildWidgetView];50     [self.view addSubview:self.bookView];51     52     53     // 延時0.01s執行54     [self performSelector:@selector(event)55                withObject:nil56                afterDelay:0.01];57 }58 59 - (void)event {60     [self.bookView moveToTextPercent:0.00];61 }62 63 @end
 項目下載連結: http://pan.baidu.com/s/1pJEfAhP 密碼: 2aj6  5、編程思想的相關思考

    在使用了UIKit的BookTextView的執行個體中,因為用到了自訂View,然後需要在自訂View上顯示富文本。由於富文本的設定可以由 多個不同的屬性值,比如:字型大小,文本前景色彩,背景色等等,所以需要抽離出來建立一個屬性-值模型對象,每個Object Storage Service一種屬性-值,然後在自訂 View中添加property的NSArray,用來儲存和重寫set方法載入傳進來的屬性-值模型對象,然後通過文字物件對應的還未設定屬性可變富文 本對象add這些屬性-值模型Object Storage Service的值。當然這個BookTextView內部因為用到UIKit所以是通過NSTextStorage *storage通過遍曆方法add載入NSArrayObject Storage Service的屬性-值。

  而在HYStringAttribute執行個體中,因為僅僅 需要直接將NSString對象對應的富文字物件設定屬性,最後添加到Label等控制項上顯示,因為考慮到簡易封裝的需求,所以特地將所有的屬性抽象成一 個需要協議約束的抽象類別,然後由這個抽象類別具體派生出具體的屬性對象,比如Font對象,前景色彩對象,背景色對象.....這裡只實現了三種,還有很多待 有時間按需求去拓展。具體使用的時候,需要通過類別拓展方法來方便使用:<1>一種是富文本類拓展出方法,這個方法實現通過參數傳入的具體的 屬性對象,然後載入這個對象,設定富文字屬性。<2>一種是NSString類拓展出方法,這個方法直接將本身執行個體對象self通過富文本創 建和載入通過參數傳入的具體的屬性對象,然後返回設定好富文字屬性的富文字物件。

     轉載註明出處:http://www.cnblogs.com/goodboy-heyang/p/5143135.html 尊重勞動成果。             

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.