iOS之UI--富文本總結

来源:http://www.cnblogs.com/goodboy-heyang/archive/2016/01/19/5143135.html
-Advertisement-
Play Games

文章內容大綱1、NSMutableAttributedString的基本使用2、NSMutableAttributedString的簡易封裝3、使用開源代碼GOBMarkupPaser處理富文本4、UITextKit簡介5、編程思想的相關思考前言富文本使用案例:這裡我自己也用了富文本實現了簡單的卻也...


文章內容大綱

  • 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) 字型大小: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完全不一樣的工具類。

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 @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
 項目下載鏈接: http://pan.baidu.com/s/1pJEfAhP 密碼: 2aj6    

5、編程思想的相關思考

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

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

         轉載註明出處:http://www.cnblogs.com/goodboy-heyang/p/5143135.html 尊重勞動成果。                          
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Swift語法基礎入門三(函數, 閉包)函數:函數是用來完成特定任務的獨立的代碼塊。你給一個函數起一個合適的名字,用來標識函數做什麼,並且當函數需要執行的時候,這個名字會被用於“調用”函數格式:func 函數名稱(參數名:參數類型, 參數名:參數類型...) -> 函數返回值 { 函數實現部分 }沒...
  • UIApplication對象特點:特點1:UIApplication對象是應用程式的象徵,一個UIApplication對象就代表一個應用程式,而且是單例的。(用來封裝整個應用程式的一個對象, 比如當應用程式執行到某個時期要做什麼, 生命周期等。)獲取UIApplication對象:[UIAppl...
  • Swift開發體驗/*:創建對象* OC: alloc initWithXXX 方法* Swift: (xxx:)*//*:調用方法* OC: [UIColor redColor];* Swift UIColor.redColor()*//*:枚舉* OC: UIB...
  • 一、weak和strong 1.理解 剛開始學UI的時候,對於weak和strong的描述看得最多的就是“由ARC引入,weak相當於OC中的assign,但是weak用於修飾對象,但是他們都不會造成引用計數加1;而strong則相當於OC中規定retain,它會造成引用計數加1”。 ARC的...
  • 背景最近要做一個輪播圖的效果,網上看了幾篇文章,基本上都能找到實現,效果還挺不錯,但是在寫的時候感覺每次都要單獨去重新在Activity里寫一堆代碼。於是自己封裝了一下。本篇輪播圖實現原理原文出處:迴圈廣告位組件的實現,這裡只是做了下封裝成一個控制項,不必每次重覆寫代碼了。效果圖實現分析輪播圖的功能就...
  • NSAttributedString的使用 使label具有點擊事件 定義帶參數巨集的註意事項 pch文件基本使用規則 使用CocoaPods集成Masonry框架 Xcode7中VVDocument插件解決方案
  • 參考:http://www.cnblogs.com/hubli/p/4835549.html效果圖:1.wevbview_progressbar.xml ...
  • 主要用於UITableView和UICollectionView,也可以用於UIScrollView,其實主要是前兩個會用到空白或者網路出錯頁 採用給UIScrollView添加代理方法來給頁面添加空白頁,源碼很有學習意義
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...