iOS富文本

iOS富文本
背景:前些天突然想做一個筆記本功能,一開始,覺得挺簡單的呀,一個UITextView,網絡緩存也不干了,直接本地NSUserDefault存儲,然后完事了,美工,弄幾張好看的圖片,加幾個動畫,也就這樣了。接著,按照慣例,查看已有的備忘錄軟件,其app store知名的軟件:Weiconote等。
才發現沒那么簡單。這里先不考慮圖文混排的問題,首先面對的就是:鍵盤隱藏之后,文字的位置移動問題啦。細心的體驗后發現:系統的備忘錄,已經一些做得好的軟件,都會進行一些處理,例如:
1.當我編輯的時候,光標應該是一直不被鍵盤高度隱藏的才對。
2.我在文字中間進行編輯的話,編輯完成隱藏鍵盤,UITextView的文字位置這個時候應該是我剛才編輯的部分。
于是開始寫:
1. 查看了暴露出來的API,屬性,不被鍵盤高度遮住,frame,contentInset,textContainerInset,都可以做到。
根據鍵盤的本身的 notification?,或者UITextView delegate ,能輕易做到。
部分代碼:
2.解決方法比較麻煩,查看了所有的api,就只有父類的這個api有用的:
- (void)scrollRectToVisible:(CGRect)rect animated:(bool)animate;
接下來的問題來了,根據光標當前的位置高度,手動計算屬性,然后,獲取要移動的位置,進行跳轉。因為默認的情況是:只要鍵盤隱藏了,會自動跳到UITextView的最前面的。至于獲取光標位置,以及計算移動的位置的問題,可以很快查到資料的。
這里的這位哥,也遇到同樣的問題,解決方式也是一樣的。?http://petersteinberger.com/blog/2014/fixing-uitextview-on-ios-7/?里邊也已經有了github源碼分享。(不做重復的事情)
事實上,問題2最好的解決方式是:自己根據TextKit封裝一個UITextView...
上面的背景就是這樣了,解決了問題后,發現,為什么不順便把圖文混排的問題也一次性解決了。一直以來,富文本編輯都是沒有深入的,之前也是直接用的開源代碼,或者UIWebView,總是心里不踏實,卡頓的情況偶爾發生,非常不開心。于是,接下來,才是今天主要想分享的東西了:富文本問題。
關鍵詞:coretext textkit
第三方庫分析:DTCoretext?M80AttributedLabel?FastText EGOText
官網參考資料:
UITextKit:?https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/Introduction/Introduction.html
CoreText:?https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/CoreText_Programming/Introduction/Introduction.html#//apple_ref/doc/uid/TP40005533
TextKit能讓我們自己手動管理字體的顏色,樣式(Text?Layout),觸摸事件,排版,圖文的混排規則。
Textkit是基于CoreText的,與WebKit是兩個不同的分支。我主要查看的也是TextKit,用coreText太麻煩了。而它們之間的關系邏輯如下圖所示:
具體到顯示上,渲染的流程是先從存儲的NSTextStorage中獲取text以及它的attributes,再經過NSLayoutManager布局顯示容器包括形狀,大小等,再經過NSTextContainer布局呈具體的顯示,最后展示在UI上。渲染和實現的流程:
這里注意描述:By using multiple text containers, each with an associated text view, more complex layout arrangements are possible.?
到了這里,基本心理有個譜了。大致清楚這個邏輯了。接下來細分一下:
a.這里,先說一下具體到文本的樣式,先上一張官方的說明圖:
我們可以設置文字的字體各種細節,段落排版,對其方式,縮進規則等。
關于樣式:自帶有六種,通過UIFont直接設置:
UIFontTextStyleHeadline,?UIFontTextStyleSubheadline,?UIFontTextStyleBody,?UIFontTextStyleFootnot,?UIFontTextStyleCaption1,?UIFontTextStyleCaption2
b.然后開始寫圖文混排了
參考代碼:
NSMutableAttributedString *string;
通過插入NSTextAttachment設置image對象,其中NSTextAttachment可以繼承重寫方法實現修改插入內容大小。
這里實際上就是找到一個NSRange位置然后插入圖片,常見的插入表情。然后表情轉換成字符串輸出出來。字符串再轉換成圖片輸出。
我們可以遍歷輸入的字符串,通過NSTextStorage設置字符串的字體,進行自定義規則處理等,例如,##進行標題大寫,高亮等。
通過NSLayoutManager來設置輸入文本內容行數,文本段的縮進規則,行間距等。
通過NSTextContainer來設置文字的布局方式,例如圖文環繞方式,等。
基本的Text Kit 功能這樣子了,基本能滿足富文本的所有要求了。自己排版,按照自己項目的業務邏輯做一些事情。
最后還是附加開頭提到的一些庫,閱讀好的源碼分析比什么都好:
M80AttributedLabel:基本的TextKit封裝,代碼易懂,例子非常好用簡單,試過效果挺好,需要做一些性能優化處理。
DTCoretext: CoreText封裝,解析正規的HTML源碼,展示出來成富文本,非常強大,如果安卓端和IOS使用同一套接口的時候,就非常好用了。兼容問題。
部分參考鏈接:
http://esoftmobile.com/2013/10/17/text-kit%E8%BF%9B%E9%98%B6/#more
https://github.com/xiangwangfeng/M80AttributedLabel
https://github.com/Cocoanetics/DTCoreText
?:DTCoreText 運行的時候有提示需要先進行:git submodule init? update?
posted on 2015-04-16 11:35 yanshanLove 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/Lxiaolong/p/4431589.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257417.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257417.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257417.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL編程題-----1

首先,題目給出這個數據庫表格 要求寫出SQL語句使之變成如下表格 解決方法: SELECT t1.Rq,t1.勝,t2.負 FROM //t1和t2是自己命的新表格的名字 (SELECT Rq,COUNT(*) AS 勝 //As 勝意思是輸出結果時列名為”勝“FROM testtableWHERE Sh…

maven設置jdk版本

兩種方式&#xff1a;一、可以修改 MAVEN 的 setting.xml 文件&#xff0c;統一修改。<profiles> <profile> <id>jdk-1.6</id> <activation> <activeByDefault>true</activeByDefault>…

獲取系統時間出錯oracle-,oracle 獲取系統時間(轉)

Oracle中如何獲取系統當前時間select to_char(sysdate,yyyy-mm-dd hh24:mi:ss) from dual;ORACLE里獲取一個時間的年、季、月、周、日的函數select to_char(sysdate, yyyy ) from dual; --年select to_char(sysdate, MM ) from dual; --月select to_char(sysdate, dd ) f…

PHP環境搭建

以Apache模塊運行PHP環境搭建方法 下載Apache 注意&#xff1a;在http://www.apachelounge.com/ 下載Apache&#xff0c;因為該網站提供的Apache是通過更高版本的VC編譯器編譯的。由于接下來我下載的PHP版本是VC11的&#xff0c;所以下載的Apache版本也是基于VC11的。 download…

Java語言中的-----訪問修飾符

day04 Java語言中的----訪問修飾符一、訪問修飾符概述&#xff1a;訪問修飾符就是對變量或者是方法或者是類的一個修飾&#xff0c;通過修飾以后實現一些必要的權限&#xff0c;主要是說明類成員如何被使用的作用。二、訪問修飾符1、訪問修飾符有哪些&#xff1f;訪問修飾符總共…

六角填數---第五屆藍橋杯

/** 如圖【1.png】所看到的六角形中&#xff0c;填入1~12的數字。使得每條直線上的數字之和都同樣。圖中&#xff0c;已經替你填好了3個數字&#xff0c;請你計算星號位置所代表的數字是多少&#xff1f;請通過瀏覽器提交答案。不要填寫多余的內容。*/ public class 六角填數 {…

linux命令編寫,編寫簡單的linux命令

8種機械鍵盤軸體對比本人程序員&#xff0c;要買一個寫代碼的鍵盤&#xff0c;請問紅軸和茶軸怎么選&#xff1f;又到了周四分享環節&#xff0c;鑒于最近在看linux編程實踐&#xff0c;所以就的講一下如何編寫一個簡單的who命令。PPTManual PageManual Page 也就是大家常用的m…

如何在ASP.NET 5和XUnit.NET中進行LocalDB集成測試

今天繼續昨天的話題——單元測試&#xff0c;不過是在ASP.NET 5中的單元測試。 在當前的Visual Studio 2015 CTP6中&#xff0c;MSTest是不支持對ASP.NET 5項目進行單元測試的。因而&#xff0c;要對ASP.NET 5進行單元測試&#xff08;或集成測試&#xff09;&#xff0c;就需要…

mysql數據庫詳解(續一)

第三節 配置MYSQL數據庫配置mysql數據庫通常通過命令行選項、配置文件、和環境變量來進行&#xff0c;并且優先順序也是命令行最高&#xff0c;環境變量優先級最低。1、配置文件定位mysql的配置文件可以在以下四個位置&#xff1a;(按照查找順序)1、/etc/my.cnf2、DATADIR/my.c…

ImageLoader設置圓形圖片

//自定義MyApplication類&#xff0c;需要在列表清單中設置 <application android:name"com.ce.image.MyApplication"//將類的名稱賦給這個application package com.ce.image;import com.nostra13.universalimageloader.core.DisplayImageOptions;import …

用戶模式 內核模式 linux,linux – “內核模式”和“用戶模式”硬件...

內核模式和用戶模式是硬件功能,特別是處理器的功能.專為中高端系統(PC,功能手機,智能手機,除最簡單的網絡設備之外的所有系統……)設計的處理器都包含此功能.內核模式可以使用不同的名稱&#xff1a;管理程序模式,特權模式等.在x86(PC中的處理器類型)中,它被稱為“ring 0”,用戶…

SANS研究所:7大最危險的攻擊技術介紹

本文講的是SANS研究所&#xff1a;7大最危險的攻擊技術介紹&#xff0c;很顯然&#xff0c;網絡攻擊威脅已經從理論走入現實生活&#xff0c;無論是個人、企業還是國家重要基礎設施都處在日益嚴峻的威脅之中。本周三&#xff08;2月15日&#xff09;在加利福尼亞州舊金山舉辦的…

第六周作業

上網調查一下目前流行的源程序版本管理軟件和項目管理軟件都有哪些&#xff0c; 各有什么優缺點&#xff1f; &#xff08;提示&#xff1a;搜索一下Microsoft TFS、GitHub、Trac、Bugzilla、Rationale&#xff0c;Apple XCode&#xff09;? 答&#xff1a;目前流行的源程序版…

css 相對定位 ie7問題

div{position:absolute;left:10px;}  或 div{position:absolute;top:10px;}   有時候left或top屬性為0就省略不寫&#xff0c;在ie7里面元素會錯位&#xff0c;解決變法就是left和top屬性都加上。轉載于:https://www.cnblogs.com/xhlddm/p/4439065.html

linux不登錄用戶就關機,Linux無法被遠程登錄;用戶的關機, 重啟,注銷,新增用戶,刪除用戶...

不能使用xshell連接到我的Linux服務器通過再windows的cmd中ping了我的Linux地址&#xff0c;發現網絡不通。查看百度發現是因為網絡沒有選橋接模式&#xff0c;然后選完橋接模式告訴我&#xff1a;然后發現沒有虛擬網卡&#xff0c;原因是之前裝過vm沒有卸載干凈&#xff0c;使…

初次就這么給了你(Django-rest-framework)

Django-Rest-Framework Django-Rest框架是構建Web API強大而靈活的工具包。 簡單粗暴&#xff0c;直奔主題。 pip install djangopip install djangorestframeworkpip install pygments # 代碼顯示高亮pip安裝好需要的工具包之后&#xff0c;我們就開始創建一…

error和exception

Error&#xff08;錯誤&#xff09;表示系統級的錯誤和程序不必處理的異常&#xff0c;是java運行環境中的內部錯誤或者硬件問題。比如&#xff1a;內存資源不足等。對于這種錯誤&#xff0c;程序基本無能為力&#xff0c;除了退出運行外別無選擇&#xff0c;它是由Java虛擬機拋…

使用logminer分析日志文件

實驗環境 win7 64 oracle PL/SQL Release 11.2.0.1.0 - Productionhttp://blog.csdn.net/tianlesoftware/article/details/5604497--這些操作需要在sysdba身份執行1.執行分析之前需要添加補充日志SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;查看補充日志是否開啟&…

linux c++ 獲取時間,詳解Linux下的C++時間類型:time_t

Unix時間戳(Unix timestamp)&#xff0c;或稱Unix時間(Unix time)、POSIX時間(POSIXtime)&#xff0c;是一種時間表示方式&#xff0c;定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。Unix時間戳不僅被使用在Unix系統、類Unix系統中&#xff0c;也在許多其他…

程序員的國慶節如何安排,你想好了嗎?

2019獨角獸企業重金招聘Python工程師標準>>> 就要國慶放假了&#xff0c;國慶節是旅游的黃金期&#xff0c;同時也是我們買買買的幸福期&#xff0c;作為一名技術開發&#xff0c;除了要安排假期旅游行程外也不要忘記提升自己&#xff0c;準備好學習計劃&#xff0c…