資料介紹
軟件簡介
ZJAttributedText 是高性能輕量級富文本框架
前言
如果遇到上面一個需求, 你會怎么處理, 若干個 UILabel + UIImageView? NSAttributedString拼接? CoreText?
我相信不論是哪種方式代碼量都不小, 并且難以復用, 其他語言寫富文本是那么輕松, Android 天生支持簡單 HTML, RN(JS) 標簽套標簽, 而只要用過 iOS 中的富文本都會覺得難用... 目前業(yè)界功能強大、較為好用的是 YYText, 但設計思想是盡可能與 UILabel、UITextView 相似, 所以相對使用也不是特別簡單, 而且框架較重。
基于現(xiàn)狀開發(fā)了一套輕量的框架?ZJAttributedText,ZJAttributedText 是高性能輕量級富文本框架,滿足大部分富文本需求, 并且提供了手勢響應、 繪制回調(diào)、 圖文對齊、 CoreText 屬性擴展、 支持網(wǎng)絡圖片、 異步繪制性能優(yōu)化, 最重要的是使用簡單, 通過鏈式語法輕松寫出一篇圖文混排文本.
示例說明
如圖所示一篇圖文混排, 涉及到字體, 顏色, 字間距, 行間距, 圖片對齊, 文字對齊, 描邊等等屬性, 還有網(wǎng)絡圖片與本地圖片混排, 手勢響應等需求, 使用本框架可以下面這樣實現(xiàn):
????//...省略常量聲明 ????//標題 ????title.font(titleFont).color(titleColor).onClicked(titleOnClicked).onLayout(titleOnLayout); ????//首段 ????firstPara.color(firstParaColor).align(@0); ????//圖片需要用一個空字符串起頭 ????NSString?*webImageString?=?@"".append(webImageURL).font(separateLineFont).minLineHeight(@100); ????//分割線 ????separateLine.font(separateLineFont).strokeColor(separateLineColor).strokeWidth(@1); ????//本地圖片 ????NSString?*locolImageString?=?@"".append(locolImage); ????//最后一段 ????lastPara.font(lastParaFont).align(@1); ????//書名 ????bookName.font(bookNameFont).color(bookNameColor).onClicked(bookOnClicked).align(@1); ????//引用 ????quote.color(quoteColor).letterSpace(@0).minLineSpace(@8).align(@0); ???? ????//設置全局默認屬性,?優(yōu)先級低于指定屬性 ????NSString?*defaultAttributes?=?@"".entire() ????.maxSize(maxSize).align(@2).letterSpace(@3).minLineHeight(@20).maxLineHeight(@20).imageAlign(@1).onClicked(textOnClicked).imageSize(imageSize); ???? ????//拼接 ????title.append(firstPara).append(webImageString).append(separateLine).append(locolImageString).append(lastPara).append(bookName).append(quote) ????//設置默認屬性 ????.append(defaultAttributes) ????//繪制View ????.drawView(^(UIView?*drawView)?{ ????????[self.view?addSubview:drawView]; ????});
甚至可以這樣實現(xiàn):
????//...省略常量聲明 ????@"" ????//拼接全文 ????.append(title).font(titleFont).color(titleColor).onClicked(titleOnClicked).onLayout(titleOnLayout) ????.append(firstPara).color(firstParaColor).align(@0) ????.append(webImageURL).font(separateLineFont).minLineHeight(@100) ????.append(separateLine).font(separateLineFont).strokeColor(separateLineColor).strokeWidth(@1) ????.append(locolImage) ????.append(lastPara).font(lastParaFont).align(@1) ????.append(bookName).font(bookNameFont).color(bookNameColor).onClicked(bookOnClicked).align(@1) ????.append(quote).color(quoteColor).letterSpace(@0).minLineSpace(@8).align(@0) ????//設置默認屬性 ????.entire().maxSize(maxSize).align(@2).letterSpace(@3).minLineHeight(@20).maxLineHeight(@20).imageAlign(@1).onClicked(textOnClicked).imageSize(imageSize) ????//繪制 ????.drawView(^(UIView?*drawView)?{ ????????[self.view?addSubview:drawView]; ????});
核心方法與屬性
對 NSString 的擴展
核心方法
-
append(id content)
拼接 content?可以是文本(NSString)、圖片(UIImage)、圖片鏈接(NSURL)(必須指定imageSize屬性)、視圖(CALayer/UIView)
-
entire()
設置整段富文本 優(yōu)先級低于指定屬性,?較為重要的屬性?maxSize?設置繪制約束,?部分段落屬性只在整段中設置生效
-
drawLayer(^(CALayer *drawLayer)completion)
繪制layer,?無法響應手勢
-
drawView(^(UIView *drawView)completion)
繪制View,?可響應手勢
屬性
通用屬性
-
verticalOffset 垂直偏移
-
onClicked 點擊回調(diào)
-
onLayout 展示回調(diào)
-
cacheFrame 緩存該段文本繪制位置
字符串屬性
-
font 字體: 文字字體/圖片居中對齊字體
-
color 顏色
-
letterSpace 字間距
-
strokeWidth 描邊寬度, 整數(shù)為鏤空, Color不生效; 負數(shù)Color生效
-
strokeColor 描邊顏色
-
verticalForm 文字繪制隨文字書寫方向, 默認 否(0), 是(非0)
-
underline 下劃線類型, 整形, 0為none, 1為細線 2為加粗 9為雙條 參考 CTUnderlineStyle(僅枚舉了三種, 其他值也有不同效果)
圖片屬性
-
imageSize 圖片尺寸, 默認為圖片本身尺寸, 會根據(jù)圖片縮放(2x 3x)自動調(diào)整
-
imageAlign 圖片對齊模式, 0為默認, 基準線對齊. 1為居中對齊至特定字體大小 參看 ZJTextImageAlign
段落屬性
-
maxSize 繪制的約束尺寸, 默認不限制
-
minLineSpace 最小行間距
-
maxLineSpace 最大行間距
-
minLineHeight 最小行高
-
maxLineHeight 最小行高
-
align 對齊, 整形, 0為默認靠左 1為靠右 2為居中, 參考 CTTextAlignment
-
lineBreakMode 對齊, 整形, 參考 NSLineBreakMode
性能
總體采用 CoreText + 異步繪制圖片完成, 理論上性能會比較高, 經(jīng)過測試如下數(shù)據(jù)供參考:
內(nèi)容: 一段文本加上兩張圖片
機型: iPhone 6
測試結(jié)果:
常規(guī)(使用NSAttributedString + UILabel)過程: 創(chuàng)建->顯示(繪制) 常規(guī)分析:
-
主線程代碼在 28ms 左右. (主線程代碼開始 至 結(jié)束耗時)
-
UILabel 顯示(繪制)耗時在 42ms 左右. (addSubview 至 drawRect 耗時)
-
綜合耗時 70ms 左右, 全部在主線程
異步繪制(本框架)過程: 創(chuàng)建->異步繪制->顯示 異步繪制分析:
-
主線程(創(chuàng)建)代碼在 28ms 左右. (主線程代碼開始 至 結(jié)束耗時)
-
創(chuàng)建(主線程) + 異步繪制耗時 84ms 左右. (主線程代碼開始 至 繪制出圖片回調(diào))
-
由 1、2 得出子線程繪制耗時 56ms 左右, 另外經(jīng)過多次試驗(大段文字繪制)得出繪制復雜的段落也耗時增長較少
-
顯示耗時 0.75 ms 左右. (addSubview 至 drawRect 耗時)
-
綜合耗時 85ms 左右, 其中主線程 29ms, 子線程 56ms
結(jié)論:
-
相較于常規(guī)方式降低了主線程壓力 70ms -> 29ms
-
越復雜的文本收益越高(多控件合一, 異步繪制), 上圖中大段富文本繪制時間也只多了 15ms, 耗時增長少
-
總體耗時增加了15ms, 都在子線程, 畢竟處理的邏輯比系統(tǒng)的多.
安裝
Github
Pod
pod?'ZJAttributedText'
本框架依賴 SDWebImage (幾乎所有App都集成了, 可以共用一套緩存邏輯)
尾巴
內(nèi)部實現(xiàn)代碼不多, 幾乎所有步驟都添加了注釋, 如果需要學習 CoreText, 異步繪制, 鏈式語法, 還算是個不錯的 Demo, 如果大家感興趣, 可以補充下 CoreText 相關內(nèi)容, 這部分網(wǎng)上的資料都比較老, 錯誤也比較多. 歡迎 issue 與 star~
- PSoC NeoPixel Easy輕量級庫
- YYText iOS文本框架
- 輕量級的媒體框架引擎組件HiStreamer 1次下載
- 原創(chuàng)分享:自制輕量級單片機UI框架
- 輕量級的SDN數(shù)據(jù)包轉(zhuǎn)發(fā)驗證方案 10次下載
- 基于Feistel結(jié)構(gòu)的超輕量級分組密碼算法 4次下載
- 基于輕量級虛擬化的LDDoS仿真攻防方法 6次下載
- 基于YOLO改進的輕量級交通標識檢測模型 12次下載
- 一種輕量級時間卷積網(wǎng)絡設計方案 6次下載
- Protothreads極輕量級系統(tǒng)的詳細資料簡介
- C#教程之自制數(shù)值文本框組件 10次下載
- 基于ARM的輕量級TCPIP協(xié)議棧的移植及應用 54次下載
- 基于MVC架構(gòu)的輕量級工作流引擎設計 0次下載
- 輕量級工作流引擎架構(gòu)設計 0次下載
- 輕量級RFID安全協(xié)議 22次下載
- 嵌入式框架Zorb Framework狀態(tài)機的實現(xiàn) 896次閱讀
- Linux輕量級工具集合Busybox的特點和使用 1185次閱讀
- 嵌入式框架Zorb Framework搭建方案 1315次閱讀
- 長短距離循環(huán)更新(LRRU)網(wǎng)絡的輕量級深度網(wǎng)絡框架介紹 787次閱讀
- 使用MVVM框架實現(xiàn)一個簡單加法器 603次閱讀
- 一個輕量級的權(quán)限認證框架:Sa-Token 1525次閱讀
- 一個純Python編寫的輕量級數(shù)據(jù)庫 700次閱讀
- 針對單片機開發(fā)的輕量級OTA組件 1199次閱讀
- TinyDB輕量級數(shù)據(jù)庫有哪些特點呢 1329次閱讀
- 一款適合初學者超輕量級C語言網(wǎng)絡庫—Dyad 1594次閱讀
- 輕量級Kubernetes-K3S工具介紹 2298次閱讀
- 全球首款輕量級機械臂已經(jīng)出現(xiàn)了! 7399次閱讀
- spring框架中定時器使用與配置 1668次閱讀
- 谷歌開發(fā)一個輕量級的庫——TFGAN 它可以讓生成對抗網(wǎng)絡更易于實驗 5412次閱讀
- 什么是Hibernate?Hibernate框架架構(gòu)與框架原理分析 5234次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多