ios開發text kit_IOS開發入門之TextKit詳解

本文將帶你了解IOS開發入門iOS 開發 富文本詳解之TextKit詳解,希望本文對大家學IOS有所幫助。

textkit結構

textkit使用步驟

#Mark?-?1.?自定義label??--class?CZLabel:?UILabel---四個屬性

//1.屬性文本存儲

private?lazy?var?textStorage?=?NSTextStorage()

//2.負責文本字形布局對象

private?lazy?var?layoutManager?=?NSLayoutManager()

//3.設定文本繪制的范圍

private?lazy?var?textContainer?=?NSTextContainer()

//4.屬性數組,保存匹配的范圍

private?lazy?var?linkRanges?=?[NSRange]()

#Mark?-?2.?重新init方法--?override?init(frame:?CGRect)?{}

//0.開啟用戶交互

userInteractionEnabled?=?true

//1.textStorage接管label的屬性

if?let?attributedText?=?attributedText?{}

//2.設置對象關系

textStorage.addLayoutManager(layoutManager)

layoutManager.addTextContainer(textContainer)

#Mark?-?3.?外界給label的text屬性賦值??label.text?=?@"@好友,#健康#,....."

//重寫屬性的text方法--一旦label里的內容發生變化,就可以讓textStorage相應變化

//1.段落處理--1.范圍??2.屬性??3.段落樣式

let?attrStringM?=?addLineBreak(attributedText!)

//2.正則匹配--1.清空原有??2.匹配范圍??3.創建正則??4.匹配??5.遍歷匹配結果,添加到屬性數組

regexLinkRanges(attrStringM)

//3.連接顏色設置---1.范圍??2.屬性??3.添加顏色??4.遍歷屬性數組,改變顏色

addLinkAttribute(attrStringM)

//4.添加到textStorage

textStorage.setAttributedString(attrStringM)

//5.重新繪制

setNeedsDisplay()

#Mark?-?4.?textStorage字形和屬性發生變化時,通知NSLayoutManager重新布局文本

//MARK:3.設置布局--制定文本繪制區域

override?func?layoutSubviews()?{

super.layoutSubviews()

//制定文本繪制區域

textContainer.size?=?bounds.size

}

#Mark?-?5.?繪制textStorage的文本內容--不能調用super

override?func?drawTextInRect(rect:?CGRect)?{

let?range?=?NSMakeRange(0,?textStorage.length)

//Glyphs--字形---CGPoint()從原點繪制,也就是右上角

layoutManager.drawGlyphsForGlyphRange(range,?atPoint:?CGPoint(x:?0,y:?0))

}

#Mark?-?6.?用戶點擊事件交互

//0.懶加載@?#?URL的匹配的正則法則?三個屬性數組

三步法:1.正則表達式??2.創建正則??3.匹配??4.便利匹配結果,添加到屬性數組

//1.獲取用戶點擊的位置

let?location?=?touches.first?.locationInView(self)

//2.獲取當前點中字符的索引

let?index?=?layoutManager.glyphIndexForPoint(location,?inTextContainer:?textContainer)

//3.判斷index在哪個標記的range?范圍上

for?range?in?atRange????[]?{

if?NSLocationInRange(index,?range)?{

let?strSub?=?(textStorage.string?as?NSString).substringWithRange(range)

//進行結果處理

}

}

Swift使用

import?UIKit

class?ZYLabel:?UILabel?{????????//attributedText富文本

//MARK:2.重寫屬性text方法,可以在ViewController里給文本賦值

//一旦label里的內容發生變化,就可以讓textStorage相應變化

override?var?text:String??{

didSet?{

if?attributedText?==?nil?{

return

}

//換行處理屬性

let?attrStringM?=?addLineBreak(attributedText!)

//換行后進行--正則匹配

regexLinkRanges(attrStringM)

//換行后進行--連接顏色設置

addLinkAttribute(attrStringM)

//添加到textStorage

textStorage.setAttributedString(attrStringM)

//重新繪制

setNeedsDisplay()

}

}

///MARK:?textKit的三個核心對象

//屬性文本存儲

private?lazy?var?textStorage?=?NSTextStorage()

//負責文本字形布局對象

private?lazy?var?layoutManager?=?NSLayoutManager()

//設定文本繪制的范圍

private?lazy?var?textContainer?=?NSTextContainer()

private?lazy?var?linkRanges?=?[NSRange]()

//純代碼接管Label

override?init(frame:?CGRect)?{

super.init(frame:?frame)

//0.開啟用戶交互

userInteractionEnabled?=?true

//1.textStorage接管label的屬性

if?let?attributedText?=?attributedText?{????????//如果原有文本設置了attribute

textStorage.setAttributedString(attributedText)

}else?if?let?text?=?text?{??????//如果原有文本沒有設置attribute

textStorage.setAttributedString(NSAttributedString(string:?text))

}else?{?????//如果原有文本為nil

textStorage.setAttributedString(NSAttributedString(string:?""))

}

//2.設置對象關系

textStorage.addLayoutManager(layoutManager)

本文由職坐標整理并發布,希望對同學們有所幫助。了解更多詳情請關注職坐標移動開發之IOS頻道!

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

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

相關文章

分布式數據庫技術基礎:數據分片介紹

1、數據分片定義數據分片也成為數據分割,是分布式數據庫的特征之一。一般在一個分布式數據庫中,全局數據庫是由各個局部數據庫邏輯組合而成的,反之各個局部數據庫是由全局數據庫的某種分割邏輯而得的。數據分片得到的各部分元組成為該關系的邏…

9.02

1.input標簽&#xff1a;<input> 標簽用于搜集用戶信息。根據不同的 type 屬性值&#xff0c;輸入字段擁有很多種形式。 輸入字段可以是文本字段、復選框、掩碼后的文本控件、單選按鈕、按鈕等等。例如&#xff1a;Frist name:<input type"text" name"…

分布式數據庫技術基礎:分布透明性相關知識

1、分布透明性介紹數據分布獨立性&#xff1a;主要是指用戶或用戶程序使用分布式數據庫如同使用集中式數據庫那樣&#xff0c;不必關系全局數據的分布情況。也就是說全局數據的邏輯分片、片段的物理位置分配、各場地數據庫的數據模型等情況對用戶和用戶應用程序是透明的。因此分…

宏基4750網卡驅動linux,宏基4750g網卡驅動下載

宏基4750g網卡驅動是宏基筆記本上網驅動&#xff0c;驅動可以幫助用戶體驗便捷上網功能&#xff0c;只需要的雙擊驅動安裝就可以完成&#xff0c;網卡驅動是筆記本必備程序&#xff0c;歡迎用戶來當易網下載體驗&#xff01;驅動介紹Acer宏碁Aspire 4750G筆記本網卡驅動14.4.0.…

python request post 數組_[pve][python]用python3獲取pve狀態信息

手頭的Proxmox VE集群和節點越來越多&#xff0c;需要考慮統一管理了&#xff0c;先定一個小目標——集中狀態監控。以前寫過檢測ceph并用釘釘報警的bash腳本&#xff0c;這次換上洋氣的方式&#xff0c;用python來通過pve的api獲取其狀態信息。首先參考proxmox官方的api(實際上…

分布式數據庫管理系統介紹

1、分布式數據庫管理系統分類綜合型體系結構&#xff1a;主要是指在分布式數據庫建立之前&#xff0c;還沒有建立獨立的集中式數據庫管理系統&#xff0c;設計人員根據用戶的需求&#xff0c;設計出一個全新的完整的數據庫管理系統。聯合型體系結構&#xff1a;主要是指每個節點…

linux中國用戶,Linux中國 適合新用戶的Linux

這個爭論無疑給許多Linux用戶帶來了麻煩。爭論的焦點一般不是哪個發行版是真正最適合新用戶的&#xff0c;而是哪個發行版受這些爭論者的喜愛。如果我們撇開個人喜愛&#xff0c;我們會看到更清楚的一面。但即使這樣&#xff0c;明確的結論也會受到被新用戶的需求和期望的影響。…

關于局部變量表slot的理解

看下圖代碼例子&#xff0c;double類型的b,占用兩個slot,所以index為3和4

Spring LDAP

LDAP Spring LDAP 使用 - Sayi像秋天一樣優雅 - 開源中國社區 http://docs.spring.io/spring-ldap/docs/current/reference/#introduction http://blog.csdn.net/techchan/article/details/5438047轉載于:https://www.cnblogs.com/hello-yz/p/5844784.html

掛起某線程命令 Linux,linux 線程掛起恢復的簡單示例

參考&#xff1a;寫了個demo&#xff1a;#include #include static pthread_mutex_t mutex;static pthread_cond_t cond;static int flag 0;void srpthread_init(){pthread_mutex_init(&mutex,NULL);pthread_cond_init(&cond,NULL);}void srpthread_suspend(){pthread…

分布式查詢處理和優化相關知識介紹

一、分布式數據庫查詢考慮的因素1、和集中式數據查詢一樣需要考慮查詢語言語句的優化2、數據和信息均需要通過通信線路進行數據傳輸&#xff0c;存在傳輸延遲問題從而影響整個查詢的執行效率。3、網絡中多處理器的存在提供了并行數據處理和傳輸的機會&#xff0c;可以充分利用該…

html下拉框設置默認值_如何設置HTML select下拉框的默認值?

HTML中的select標簽用于創建可選擇選項的下拉列表&#xff1b;option標簽包含選定時將使用的值。那么如何來設置select下拉框里的默認值&#xff1f;下面本篇文章就來給大家介紹一下&#xff0c;希望對大家有所幫助。我們可以在所需選項上使用“selected”屬性來設置select元素…

操作數棧的字節碼指令執行分析

一&#xff1a;寫個demo 二&#xff1a;點擊Recompile編譯 三&#xff1a;使用javap命令反編譯class文件 javap -v 類名.class 四&#xff1a;查看結果 五&#xff1a;分析執行過程 首先bipush意思是把byte類型的變量i的值15存放到操作數棧中&#xff0c;istore_1的意思…

wordpress 當前欄目名,當前欄目的分類名

wordpress在設計主題和做模板時經常會用到調用當前分類欄目名稱&#xff0c;常見的有當前欄目頁、文章頁&#xff0c;詳情代碼如下&#xff1a; 1.分類名稱與鏈接 <?php the_category(); ?> 2.分類頁面調用當前分類名稱 要在分類頁得到分類頁面的欄目名稱,需要用<?…

分布式數據庫基礎:分布式事務相關概念介紹

1、事務的定義事務式訪問數據庫的一個邏輯工作單位&#xff0c;它屬于一個操作序列&#xff0c;執行這個操作序列使數據庫從一種一致狀態轉換到另外一種一致狀態&#xff0c;從而實現特定業務的功能。2、分布式事務的定義分布式事務屬于傳統事務的擴展&#xff0c;分布式事務繼…

windows比linux差在哪,怎么讓新手理解Linux比Windows好在哪里!

pingpang2008 于 2009-06-17 08:54:31發表:人好多啊hantu 于 2009-06-16 23:28:57發表:哈哈,偏偏很多人就是不爽windows了才用Linux的劉沖 于 2009-06-16 21:44:08發表:linux比windows好嗎&#xff1f;wayoking 于 2009-06-16 20:45:11發表:理解了&#xff0c;謝謝cscs2002 于 …

12c創建為容器數據庫_oracle 12c創建可插拔數據庫(PDB)與用戶詳解

前言由于oracle 12c使用了CDB-PDB架構&#xff0c;類似于docker&#xff0c;在container-db內可以加載多個pluggable-db&#xff0c;因此安裝后需要額外配置才能使用。一、修改listener.ora , tnsnames.ora###listener.ora###LISTENER (DESCRIPTION (ADDRESS (PROTOCOL TCP)(…

大型分布式存儲方案MinIO介紹,看完你就懂了!

1、MinIO是什么&#xff1f;官方解釋&#xff1a;MinIO 是一個基于Apache License v2.0開源協議的對象存儲服務。它兼容亞馬遜S3云存儲服務接口&#xff0c;非常適合于存儲大容量非結構化的數據&#xff0c;例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等&#xff0c;…