TextKit(圖片混排)

1、TextKit 探究

1.1 TextKit的概述

在iOS7中,蘋果引入了Text Kit——Text Kit是一個快速而又現代化的文字排版和渲染引擎。Text Kit在UIKit framework中的定義了一些類和相關協議,它最主要的做用就是爲程序提供文字排版和渲染的功能。在程序中,經過Text Kit能夠對文字進行存儲(store)、佈局(layout),以及用最精細的排版方式(例如文字間距、換行和對齊等)來顯示文本內容。TextKit的引入主要是爲了解決Core Text複雜難用,若是隻是從解決大部分功能來講,使用TextKit的開發效率會比Core Text高。TextKit 只是 對Core Text進行了一些易用性封裝,解決一些諸如簡單文字排版,文字樣式變換等基本需求。正則表達式

Text Kit具備不少優勢:文本控件UITextView、UITextField和UILabel是構建於Text Kit之上的。Text Kit徹底􏲏 掌控着文字的排版和渲染:能夠調整字距􏲐、行􏲐距、文字大小􏰔,指􏱒定的字體,對文字進行分頁或分欄,􏲑支持􏲒文本編輯􏲓、自定義􏰙文字截􏲔斷,􏲑支持文字的換行、􏲕摺疊􏱑和着色􏲖等處理,􏲑支持凸􏱉版印刷效􏱊􏱋􏰖果。數組

1.2 TextKit的架構

能夠從圖中看出,原生的文本控件都是構建在TextKit之上的,使用TextKit進行排版和渲染。而UIWebView是構建在WebKit上的,不能使用TextKit功能。瀏覽器

TextKit的做用服務器

兩個最重要的功能:架構

  • 文字排版
  • 文字渲染

1.3 TextKit中重要的類

 使用TextKit進行文本佈局流程佈局

實現的過程以下:字體

storage --> layoutManager --> textContainer --> textView動畫

        理解:TextKit主要用於更精細的處理文本佈局以及進行復雜的圖文混排佈局,使用TextKit進行文本的佈局展現十分繁瑣,首先須要將顯示內容定義爲一個NSTextStorage對象,以後爲其添加一個佈局管理器對象NSLayoutManager,在NSLayoutManager中,須要進行NSTextContainer的定義,定義多了NSTextContainer對象則會將文本進行分頁。最後,將要展現的NSTextContainer放到具體的UITextView視圖上。編碼

  • TextView:主要是指UILabel,UITextField,UITextView這些文本控件
  • TextContainer:對應TextKit中的NSTextContainer,主要做用是定義排版區域,區域能夠是圓形矩形甚至是不規則的圖形,也能夠定義不能填充的區域來顯示非文本元素。
  • Layout Manager:對應TextKit中的NSLayoutManager,主要做用是定義佈局方式,使文本內容按照必定的佈局方式進行排版。
  • Text Storage:對應TextKit中的NSTextStorage,繼承自NSMutableAttributedString,主要做用是存儲文本字符和文本相關屬性。當NSTextStorage的屬性發生變化時,會通知NSLayoutManager進行從新排版。

2、Text Kit特色和功能

2.1 Text Kit特色

從上面的介紹中,咱們能夠了解到Text Kit在UIKit中的做用很是重要。Text Kit在實際開發中具備以下特色:spa

  • 在UI控件中Text Kit徹底掌控着文字的排版和渲染
  • UITextView、UITextField和UILabel是構建於Text Kit之上的
  • 可以與動畫、UICollectionView和UITableView作到無縫集成
  • Text Kit具備這樣一些能力:Subclassing、Delegation和Notifcation。

2.2Text Kit功能

下面咱們看看經過Text Kit,都能實現那些功能(這裏列出了是一些經常使用和重要功能):

  • 對文字進行分頁或多列排版
  • 支持文字的換行、摺疊和着色等處理
  • 能夠調整字與字之間的距離、行間距、文字大小、指定特定的字體
  • 支持富文本編輯,能夠自定義文字截斷
  • 支持凸版印刷效果(letterpress)
  • 支持數據類型的檢測(例如連接、附件等)

2.3 AttributedString設置屬性

AttributedString能夠設置屬性,具體來講:

NSFontAttributeName                設置字體屬性,默認值:字體:Helvetica(Neue) 字號:12
NSForegroundColorAttributeName      設置字體顏色,取值爲 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 對象

3、具體代碼事例

讀取文本

// 讀取文本
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"text.txt" ofType:nil];
    //將txt到string對象中,編碼類型爲NSUTF8StringEncoding
    text = [[NSString  alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

將不讓文字排版區域的path都保存下來,設置給TextContainer:

//將不讓文字排版區域的path都保存下來,設置給TextContainer
- (void)configExcludeViews:(UITextView *)textView {
    
    if ((!self.exclusionViews) || (self.exclusionViews.count == 0)) {
        return;
    }
    
    NSMutableArray *excludePaths = [NSMutableArray arrayWithCapacity:self.exclusionViews.count];
    
    for (ExclusionView *excludeView in self.exclusionViews) {
        
        //將排除不顯示文字的view依次加入到 _textView
        [textView addSubview:excludeView];
        
        UIBezierPath *bezierPath = [excludeView createExcludeBezierPathWithSelf];
        [excludePaths addObject:bezierPath];        
    }
    
    //將不顯示文字的區域,設置給 textView.textContainer
    self.textContainer.exclusionPaths = excludePaths;
}

4、正則表達式

在表單驗證中,咱們常常會使用到正則表達式,由於咱們須要用它來判斷用戶輸入的字符是否爲合法的,若是是不合法的,那麼應該提示用戶輸入錯誤,並不讓提交至服務器。咱們也能夠經過正則表達式,從用戶輸入的字符串中過濾並獲取咱們想要的特定部分。總而言之,正則表達式是很強大的。

正則表達式的使用方法:

方法1.謂詞(NSPredicate)建立正則表達式

方法2.NSString實例方法(使用 rangeOfString:options: 方法能夠作到)

方法3.NSRegularExpression類建立正則表達式

關鍵字樣式風格:

// 關鍵字樣式風格
-(void)markWord:(NSString *)word inTextStorage:(NSTextStorage *)textStorage;

搜索關鍵詞,設置富文本屬性改變樣式:

- (void) markWord:(NSString*)word inTextStorage:(NSTextStorage*)textStorage
{
    //1. regx
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:word
                                                                           options:0
                                                                             error:nil];
    
    //2.經過正則表達式NSRegularExpression對象對TextView中的文本內容進行掃描,結果放到數組中
    NSArray *matches = [regex matchesInString:self.textView.text
                                      options:0
                                        range:NSMakeRange(0, [self.textView.text length])];
    
    //3.設置文字效果(從集合中取出NSTextCheckingResult結果對象)
    for (NSTextCheckingResult *match in matches) {
        
        NSRange matchRange = [match range];
        
        //4.爲找到的文本設置顏色
        [textStorage addAttribute:NSForegroundColorAttributeName
                            value:[UIColor greenColor]
                            range:matchRange];
        
        [textStorage addAttribute:NSFontAttributeName
                            value:[UIFont systemFontOfSize:22.0f]
                            range:matchRange];
    }

上述代碼第1個是建立正則表達式NSRegularExpression對象,其中的regularExpressionWithPattern參數指定正則表達式。

第2個代碼經過正則表達式NSRegularExpression對象對TextView中的文本內容進行掃描,而後放到數組中。第3個代碼從集合中取出NSTextCheckingResult結果對象。

第4個代碼是爲找到的文本設置顏色爲綠色風格。

5、 總結

NSTextStorage保存並管理UITextView要展現的文字內容,該類是NSMutableAttributedString的子類,因爲能夠靈活地往文字添加或修改屬性,因此適用於保存並修改文字屬性。

NSLayoutManager用於管理NSTextStorage其中的文字內容的排版佈局。

NSTextContainer則定義了一個矩形區域用於存放已經進行了排版並設置好屬性的文字。

三者是相互包含相互做用的層次關係。

相關文章
相關標籤/搜索