資料介紹
軟件簡介
ZJAttributedText 是高性能輕量級富文本框架
前言
如果遇到上面一個需求, 你會怎么處理, 若干個 UILabel + UIImageView? NSAttributedString拼接? CoreText?
我相信不論是哪種方式代碼量都不小, 并且難以復用, 其他語言寫富文本是那么輕松, Android 天生支持簡單 HTML, RN(JS) 標簽套標簽, 而只要用過 iOS 中的富文本都會覺得難用... 目前業界功能強大、較為好用的是 YYText, 但設計思想是盡可能與 UILabel、UITextView 相似, 所以相對使用也不是特別簡單, 而且框架較重。
基于現狀開發了一套輕量的框架?ZJAttributedText,ZJAttributedText 是高性能輕量級富文本框架,滿足大部分富文本需求, 并且提供了手勢響應、 繪制回調、 圖文對齊、 CoreText 屬性擴展、 支持網絡圖片、 異步繪制性能優化, 最重要的是使用簡單, 通過鏈式語法輕松寫出一篇圖文混排文本.
示例說明
如圖所示一篇圖文混排, 涉及到字體, 顏色, 字間距, 行間距, 圖片對齊, 文字對齊, 描邊等等屬性, 還有網絡圖片與本地圖片混排, 手勢響應等需求, 使用本框架可以下面這樣實現:
????//...省略常量聲明 ????//標題 ????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); ???? ????//設置全局默認屬性,?優先級低于指定屬性 ????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]; ????});
甚至可以這樣實現:
????//...省略常量聲明 ????@"" ????//拼接全文 ????.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()
設置整段富文本 優先級低于指定屬性,?較為重要的屬性?maxSize?設置繪制約束,?部分段落屬性只在整段中設置生效
-
drawLayer(^(CALayer *drawLayer)completion)
繪制layer,?無法響應手勢
-
drawView(^(UIView *drawView)completion)
繪制View,?可響應手勢
屬性
通用屬性
-
verticalOffset 垂直偏移
-
onClicked 點擊回調
-
onLayout 展示回調
-
cacheFrame 緩存該段文本繪制位置
字符串屬性
-
font 字體: 文字字體/圖片居中對齊字體
-
color 顏色
-
letterSpace 字間距
-
strokeWidth 描邊寬度, 整數為鏤空, Color不生效; 負數Color生效
-
strokeColor 描邊顏色
-
verticalForm 文字繪制隨文字書寫方向, 默認 否(0), 是(非0)
-
underline 下劃線類型, 整形, 0為none, 1為細線 2為加粗 9為雙條 參考 CTUnderlineStyle(僅枚舉了三種, 其他值也有不同效果)
圖片屬性
-
imageSize 圖片尺寸, 默認為圖片本身尺寸, 會根據圖片縮放(2x 3x)自動調整
-
imageAlign 圖片對齊模式, 0為默認, 基準線對齊. 1為居中對齊至特定字體大小 參看 ZJTextImageAlign
段落屬性
-
maxSize 繪制的約束尺寸, 默認不限制
-
minLineSpace 最小行間距
-
maxLineSpace 最大行間距
-
minLineHeight 最小行高
-
maxLineHeight 最小行高
-
align 對齊, 整形, 0為默認靠左 1為靠右 2為居中, 參考 CTTextAlignment
-
lineBreakMode 對齊, 整形, 參考 NSLineBreakMode
性能
總體采用 CoreText + 異步繪制圖片完成, 理論上性能會比較高, 經過測試如下數據供參考:
內容: 一段文本加上兩張圖片
機型: iPhone 6
測試結果:
常規(使用NSAttributedString + UILabel)過程: 創建->顯示(繪制) 常規分析:
-
主線程代碼在 28ms 左右. (主線程代碼開始 至 結束耗時)
-
UILabel 顯示(繪制)耗時在 42ms 左右. (addSubview 至 drawRect 耗時)
-
綜合耗時 70ms 左右, 全部在主線程
異步繪制(本框架)過程: 創建->異步繪制->顯示 異步繪制分析:
-
主線程(創建)代碼在 28ms 左右. (主線程代碼開始 至 結束耗時)
-
創建(主線程) + 異步繪制耗時 84ms 左右. (主線程代碼開始 至 繪制出圖片回調)
-
由 1、2 得出子線程繪制耗時 56ms 左右, 另外經過多次試驗(大段文字繪制)得出繪制復雜的段落也耗時增長較少
-
顯示耗時 0.75 ms 左右. (addSubview 至 drawRect 耗時)
-
綜合耗時 85ms 左右, 其中主線程 29ms, 子線程 56ms
結論:
-
相較于常規方式降低了主線程壓力 70ms -> 29ms
-
越復雜的文本收益越高(多控件合一, 異步繪制), 上圖中大段富文本繪制時間也只多了 15ms, 耗時增長少
-
總體耗時增加了15ms, 都在子線程, 畢竟處理的邏輯比系統的多.
安裝
Github
Pod
pod?'ZJAttributedText'
本框架依賴 SDWebImage (幾乎所有App都集成了, 可以共用一套緩存邏輯)
尾巴
內部實現代碼不多, 幾乎所有步驟都添加了注釋, 如果需要學習 CoreText, 異步繪制, 鏈式語法, 還算是個不錯的 Demo, 如果大家感興趣, 可以補充下 CoreText 相關內容, 這部分網上的資料都比較老, 錯誤也比較多. 歡迎 issue 與 star~
- PSoC NeoPixel Easy輕量級庫
- YYText iOS文本框架
- 輕量級的媒體框架引擎組件HiStreamer 1次下載
- 原創分享:自制輕量級單片機UI框架
- 輕量級的SDN數據包轉發驗證方案 10次下載
- 基于Feistel結構的超輕量級分組密碼算法 4次下載
- 基于輕量級虛擬化的LDDoS仿真攻防方法 6次下載
- 基于YOLO改進的輕量級交通標識檢測模型 12次下載
- 一種輕量級時間卷積網絡設計方案 6次下載
- Protothreads極輕量級系統的詳細資料簡介
- C#教程之自制數值文本框組件 10次下載
- 基于ARM的輕量級TCPIP協議棧的移植及應用 54次下載
- 基于MVC架構的輕量級工作流引擎設計 0次下載
- 輕量級工作流引擎架構設計 0次下載
- 輕量級RFID安全協議 22次下載
- 嵌入式框架Zorb Framework狀態機的實現 896次閱讀
- Linux輕量級工具集合Busybox的特點和使用 1185次閱讀
- 嵌入式框架Zorb Framework搭建方案 1315次閱讀
- 長短距離循環更新(LRRU)網絡的輕量級深度網絡框架介紹 787次閱讀
- 使用MVVM框架實現一個簡單加法器 603次閱讀
- 一個輕量級的權限認證框架:Sa-Token 1525次閱讀
- 一個純Python編寫的輕量級數據庫 700次閱讀
- 針對單片機開發的輕量級OTA組件 1199次閱讀
- TinyDB輕量級數據庫有哪些特點呢 1329次閱讀
- 一款適合初學者超輕量級C語言網絡庫—Dyad 1594次閱讀
- 輕量級Kubernetes-K3S工具介紹 2298次閱讀
- 全球首款輕量級機械臂已經出現了! 7399次閱讀
- spring框架中定時器使用與配置 1668次閱讀
- 谷歌開發一個輕量級的庫——TFGAN 它可以讓生成對抗網絡更易于實驗 5412次閱讀
- 什么是Hibernate?Hibernate框架架構與框架原理分析 5234次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 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開發指南
- 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數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 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次下載 | 免費
評論
查看更多