版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2018.09.01 |
前言
TextKit
框架是對(duì)Core Text
的封裝,用簡(jiǎn)潔的調(diào)用方式實(shí)現(xiàn)了大部分Core Text
的功能办斑。 TextKit是一個(gè)偏上層的開(kāi)發(fā)框架外恕,在iOS7
以上可用,使用它可以方便靈活處理復(fù)雜的文本布局乡翅,滿足開(kāi)發(fā)中對(duì)文本布局的各種復(fù)雜需求鳞疲。TextKit實(shí)際上是基于CoreText的一個(gè)上層框架,其是面向?qū)ο蟮穆屠省=酉聛?lái)幾篇我們就一起看一下這個(gè)框架建丧。感興趣的看下面幾篇文章排龄。
1. TextKit框架詳細(xì)解析 (一) —— 基本概覽和應(yīng)用場(chǎng)景(一)
2. TextKit框架詳細(xì)解析 (二) —— 基本概覽和應(yīng)用場(chǎng)景(二)
3. TextKit框架詳細(xì)解析 (三) —— 一個(gè)簡(jiǎn)單布局示例(一)
4. TextKit框架詳細(xì)解析 (四) —— 一個(gè)簡(jiǎn)單布局示例(二)
5. TextKit框架詳細(xì)解析 (五) —— 文本編程指南之簡(jiǎn)介(一)
6. TextKit框架詳細(xì)解析 (六) —— 文本編程指南之展示文本內(nèi)容(二)
7. TextKit框架詳細(xì)解析 (七) —— 文本編程指南之排版概念(三)
8. TextKit框架詳細(xì)解析 (八) —— 文本編程指南之管理Text Fields and Text Views(四)
9. TextKit框架詳細(xì)解析 (九) —— 文本編程指南之管理鍵盤(pán)(五)
Copy, Cut, and Paste Operations - 復(fù)制波势、剪切和粘貼操作
用戶可以在一個(gè)應(yīng)用程序中復(fù)制文本,圖像或其他數(shù)據(jù)橄维,并將該數(shù)據(jù)粘貼到同一應(yīng)用程序或不同應(yīng)用程序中的其他位置尺铣。 例如,您可以在電子郵件中復(fù)制個(gè)人的地址争舞,并將其粘貼到Contacts
應(yīng)用中的相應(yīng)field
中凛忿。 UIKit框架在UITextView
和UITextField
類(lèi)中實(shí)現(xiàn)了copy-cut-paste
。 如果您希望在自己的應(yīng)用程序中使用此行為竞川,則可以使用這些類(lèi)的對(duì)象店溢,也可以自行實(shí)現(xiàn)copy-cut-paste
。
以下部分描述了UIKit的編程接口委乌,用于復(fù)制床牧,剪切和粘貼操作,并說(shuō)明如何使用它們遭贸。
注意:有關(guān)復(fù)制和粘貼操作的使用指南戈咳,請(qǐng)參閱
iOS Human Interface Guidelines
中的Supporting Copy and Paste
。
Copy-Paste Operations in UIKit - UIKit中的復(fù)制粘貼操作
UIKit框架的幾個(gè)類(lèi)和非正式協(xié)議為您提供了在應(yīng)用程序中實(shí)現(xiàn)復(fù)制壕吹,剪切和粘貼操作所需的方法和機(jī)制:
- UIPasteboard類(lèi)提供粘貼板:用于在應(yīng)用程序內(nèi)或應(yīng)用程序之間共享數(shù)據(jù)的保護(hù)區(qū)域著蛙。該類(lèi)提供了在粘貼板上寫(xiě)入和讀取數(shù)據(jù)項(xiàng)的方法。
- UIMenuController類(lèi)在選擇的上方或下方顯示要復(fù)制耳贬,剪切或粘貼的編輯菜單踏堡。編輯菜單的默認(rèn)命令是(可能)復(fù)制,剪切咒劲,粘貼顷蟆,選擇和全選胖秒。您還可以將自定義菜單項(xiàng)添加到編輯菜單(請(qǐng)參閱 Adding Custom Items to the Edit Menu)。
- UIResponder類(lèi)聲明方法canPerformAction:withSender:慕的。響應(yīng)者類(lèi)可以實(shí)現(xiàn)此方法阎肝,以根據(jù)當(dāng)前上下文顯示和刪除編輯菜單的命令。
-
UIResponderStandardEditActions
非正式協(xié)議聲明了用于處理復(fù)制肮街,剪切风题,粘貼,選擇和全選命令的接口嫉父。當(dāng)用戶點(diǎn)擊編輯菜單中的一個(gè)命令時(shí)沛硅,將調(diào)用相應(yīng)的UIResponderStandardEditActions
方法。
Pasteboard Concepts - 粘貼板概念
粘貼板是用于在應(yīng)用程序內(nèi)或應(yīng)用程序之間交換數(shù)據(jù)的標(biāo)準(zhǔn)化機(jī)制绕辖。粘貼板最常用的用途是處理復(fù)制摇肌,剪切和粘貼操作:
- 當(dāng)用戶在應(yīng)用程序中選擇數(shù)據(jù)并選擇“復(fù)制(或剪切)”菜單命令時(shí),所選數(shù)據(jù)將被放置到粘貼板上仪际。
- 當(dāng)用戶選擇“粘貼”菜單命令(在相同或不同的應(yīng)用程序中)時(shí)围小,粘貼板上的數(shù)據(jù)將從粘貼板復(fù)制到當(dāng)前應(yīng)用程序。
在iOS中树碱,粘貼板也用于支持查找操作肯适。此外,您可以使用粘貼板使用自定義URL方案而不是復(fù)制成榜,剪切和粘貼命令在應(yīng)用之間傳輸數(shù)據(jù)框舔;有關(guān)此技術(shù)的信息,請(qǐng)參閱Updating Your Info.plist
赎婚。
無(wú)論操作如何刘绣,使用粘貼板對(duì)象執(zhí)行的基本任務(wù)都是將數(shù)據(jù)寫(xiě)入粘貼板并從粘貼板讀取數(shù)據(jù)。雖然這些任務(wù)在概念上很簡(jiǎn)單挣输,但它們掩蓋了許多重要的細(xì)節(jié)纬凤。主要的復(fù)雜性是可能有多種方式來(lái)表示數(shù)據(jù),這種復(fù)雜性導(dǎo)致了對(duì)效率的考慮歧焦。以下各節(jié)將討論這些問(wèn)題和其他問(wèn)題移斩。
1. Named Pasteboards
粘貼板可以是公共的或私人的。公共粘貼板稱為系統(tǒng)粘貼板绢馍;私人粘貼板由應(yīng)用程序創(chuàng)建向瓷,因此稱為app粘貼板。粘貼板必須具有唯一的名稱舰涌。 UIPasteboard
定義了兩個(gè)系統(tǒng)粘貼板猖任,每個(gè)粘貼板都有自己的名稱和用途:
-
UIPasteboardNameGeneral
用于涉及各種數(shù)據(jù)類(lèi)型的剪切,復(fù)制和粘貼操作瓷耙。您可以通過(guò)調(diào)用generalPasteboard類(lèi)方法獲取表示常規(guī)粘貼板的單例對(duì)象朱躺。 -
UIPasteboardNameFind
用于搜索操作刁赖。用戶在搜索欄(UISearchBar)
中當(dāng)前鍵入的字符串將寫(xiě)入此粘貼板,因此可以在應(yīng)用程序之間共享长搀。您可以通過(guò)調(diào)用pasteboardWithName:create:類(lèi)方法獲取表示查找粘貼板的對(duì)象宇弛,并為該名稱傳入UIPasteboardNameFind
。
通常您使用系統(tǒng)定義的粘貼板之一源请,但如果需要枪芒,您可以使用pasteboardWithName:create:創(chuàng)建自己的應(yīng)用粘貼板。如果您調(diào)用pasteboardWithUniqueName谁尸,UIPasteboard
會(huì)為您提供一個(gè)具有唯一名稱的應(yīng)用粘貼板舅踪。您可以通過(guò)其name
屬性發(fā)現(xiàn)粘貼板的名稱。
2. Pasteboard Persistence - 粘貼板持久性
粘貼板可以是持久的良蛮。 當(dāng)粘貼板持久存在時(shí)抽碌,它將繼續(xù)存在于應(yīng)用程序終止之后并且跨系統(tǒng)重新啟動(dòng)。 系統(tǒng)粘貼板是持久的决瞳。 雖然默認(rèn)情況下應(yīng)用程序粘貼板不是持久性的货徙,但應(yīng)用程序可以通過(guò)將persistent
屬性設(shè)置為YES
將它們標(biāo)記為持久性。 不持久的應(yīng)用程序粘貼板只會(huì)持續(xù)到擁有(創(chuàng)建)應(yīng)用程序退出瞒斩。 在卸載創(chuàng)建它的應(yīng)用程序時(shí)破婆,將刪除持久性應(yīng)用程序粘貼板涮总。
3. Pasteboard Owner and Items - 粘貼板所有者和項(xiàng)目
最后將數(shù)據(jù)放到粘貼板上的對(duì)象稱為粘貼板所有者胸囱。 放置在粘貼板上的每條數(shù)據(jù)都被視為粘貼板項(xiàng)目。 粘貼板可以容納單個(gè)或多個(gè)項(xiàng)目瀑梗。 應(yīng)用可以根據(jù)需要放置或檢索任意數(shù)量的項(xiàng)目烹笔。 例如,假設(shè)視圖中的用戶選擇包含文本和圖像抛丽。 通過(guò)粘貼板谤职,您可以將文本和圖像作為單獨(dú)的項(xiàng)目復(fù)制到粘貼板。 從粘貼板讀取多個(gè)項(xiàng)目的應(yīng)用程序可以選擇僅采用它支持的項(xiàng)目(例如文本亿鲜,但不包括圖像)允蜈。
重要提示:當(dāng)應(yīng)用程序?qū)?shù)據(jù)寫(xiě)入粘貼板時(shí),即使它只是一個(gè)項(xiàng)目蒿柳,該數(shù)據(jù)也會(huì)替換粘貼板的當(dāng)前內(nèi)容饶套。 雖然您可以使用UIPasteboard
的addItems:
方法來(lái)追加項(xiàng)目,但是類(lèi)的write方法不會(huì)將項(xiàng)目附加到粘貼板的當(dāng)前內(nèi)容垒探。
4. Representations and UTIs
粘貼板操作通常在兩個(gè)不同的應(yīng)用程序之間執(zhí)行妓蛮。兩個(gè)應(yīng)用程序都不需要知道另一個(gè)應(yīng)用程序,包括它可以處理的數(shù)據(jù)類(lèi)型圾叼。為了最大化共享的可能性蛤克,粘貼板可以保存同一粘貼板項(xiàng)目的多個(gè)表示捺癞。例如,富文本編輯器可能提供復(fù)制數(shù)據(jù)的HTML构挤,PDF和純文本表示髓介。粘貼板上的項(xiàng)目包括應(yīng)用程序可以提供的該數(shù)據(jù)項(xiàng)的所有表示。
粘貼板項(xiàng)的每個(gè)表示通常由唯一類(lèi)型標(biāo)識(shí)符(Unique Type Identifier - UTI)
標(biāo)識(shí)筋现。 (UTI只是一個(gè)唯一標(biāo)識(shí)特定數(shù)據(jù)類(lèi)型的字符串版保。)UTI提供了一種識(shí)別數(shù)據(jù)類(lèi)型的通用方法。如果您希望支持自定義數(shù)據(jù)類(lèi)型夫否,則必須為其創(chuàng)建唯一標(biāo)識(shí)符彻犁。為此,您可以對(duì)表示類(lèi)型字符串使用反向DNS表示法以確保唯一性凰慈;例如汞幢,自定義表示類(lèi)型可以是com.myCompany.myApp.myType
。有關(guān)UTI的更多信息微谓,請(qǐng)參閱Uniform Type Identifiers Overview森篷。
例如,假設(shè)某個(gè)應(yīng)用程序支持選擇富文本和圖像豺型。它可能希望在粘貼板上放置文本選擇的富文本和Unicode版本以及圖像選擇的不同表示仲智。每個(gè)項(xiàng)目的每個(gè)表示都存儲(chǔ)有自己的數(shù)據(jù),如圖5-所示
通常姻氨,為了最大化共享的可能性钓辆,粘貼板項(xiàng)目應(yīng)包括盡可能多的不同表示。
粘貼板閱讀器必須找到最適合其功能的數(shù)據(jù)類(lèi)型(如果有)肴焊。 通常前联,這意味著選擇最豐富的類(lèi)型。 例如娶眷,文本編輯器可能提供HTML(富文本)和復(fù)制文本數(shù)據(jù)的純文本表示似嗤。 支持富文本的應(yīng)用程序應(yīng)檢索HTML表示,并且僅支持純文本的應(yīng)用程序應(yīng)檢索純文本版本届宠。
5. Change Count - 更改數(shù)量
更改計(jì)數(shù)是每個(gè)粘貼板變量烁落,每次粘貼板的內(nèi)容發(fā)生更改時(shí)都會(huì)增加 - 特別是在添加,修改或刪除項(xiàng)目時(shí)豌注。 通過(guò)檢查更改計(jì)數(shù)(通過(guò)changeCount
屬性)伤塌,應(yīng)用程序可以確定粘貼板中的當(dāng)前數(shù)據(jù)是否與上次接收的數(shù)據(jù)相同。 每次更改計(jì)數(shù)遞增時(shí)幌羞,粘貼板都會(huì)向感興趣的觀察者發(fā)送通知寸谜。
First Steps: Identify the Selection and Display the Edit Menu - 第一步:確定選擇并顯示編輯菜單
如果要復(fù)制,剪切或粘貼某些內(nèi)容,首先必須選擇它熊痴。 (粘貼操作通常在空的選擇上操作他爸,例如插入符號(hào)棍厌,指示項(xiàng)目集合中的位置瓜饥。)選擇項(xiàng)目后 - 并在視覺(jué)上指示選擇 - 您應(yīng)該顯示編輯菜單。 編輯菜單是一個(gè)系統(tǒng)菜單产舞,可能包含以下命令:復(fù)制巾陕,剪切讨跟,粘貼,選擇和全選鄙煤。 編輯菜單指向選擇晾匠。 當(dāng)用戶點(diǎn)擊菜單項(xiàng)時(shí),將調(diào)用相應(yīng)的UIResponderStandardEditActions
方法實(shí)現(xiàn)(例如cut:
或paste :
)梯刚。
有關(guān)選擇的更多信息以及如何顯示和管理編輯菜單凉馆,請(qǐng)參閱Managing the Selection and the Edit Menu。
Copying and Cutting the Selection - 復(fù)制和剪切選擇
當(dāng)用戶點(diǎn)擊編輯菜單的“復(fù)制”或“剪切”命令時(shí)亡资,系統(tǒng)會(huì)調(diào)用實(shí)現(xiàn)它的響應(yīng)器對(duì)象的copy:
或cut:
方法澜共。通常第一個(gè)響應(yīng)者 - 您的自定義視圖 - 實(shí)現(xiàn)這些方法,但如果第一個(gè)響應(yīng)者沒(méi)有實(shí)現(xiàn)它們锥腻,則消息以通常的方式沿響應(yīng)者鏈向上傳播嗦董。請(qǐng)注意,UIResponderStandardEditActions
非正式協(xié)議聲明了這些方法瘦黑。
注意:由于
UIResponderStandardEditActions
是一種非正式協(xié)議京革,因此應(yīng)用程序中的任何類(lèi)都可以實(shí)現(xiàn)其方法。但是為了利用遍歷響應(yīng)者鏈的默認(rèn)行為供璧,實(shí)現(xiàn)這些方法的類(lèi)應(yīng)該從UIResponder
繼承存崖,并且應(yīng)該安裝在響應(yīng)者鏈中。
在響應(yīng)copy:
或cut:
消息時(shí)睡毒,您可以使用盡可能多的不同表示將選擇所代表的對(duì)象或數(shù)據(jù)寫(xiě)入粘貼板。此操作涉及以下步驟(假設(shè)單個(gè)粘貼板項(xiàng)目):
1)從選擇中冗栗,識(shí)別或獲得對(duì)象或?qū)?yīng)于對(duì)象的二進(jìn)制數(shù)據(jù)演顾。二進(jìn)制數(shù)據(jù)必須封裝在NSData對(duì)象中。如果要將另一種類(lèi)型的對(duì)象寫(xiě)入粘貼板隅居,它必須是屬性列表對(duì)象 - 即以下類(lèi)之一的對(duì)象:NSString钠至,NSArray,NSDictionary胎源,NSDate棉钧,NSNumber或NSURL。 (有關(guān)屬性列表對(duì)象的更多信息涕蚤,請(qǐng)參閱Property List Programming Guide宪卿。)
2)如果可能的诵,生成對(duì)象或數(shù)據(jù)的一個(gè)或多個(gè)其他表示。例如佑钾,如果在上一步中創(chuàng)建了表示所選圖像的UIImage對(duì)象西疤,則可以使用UIImageJPEGRepresentation和UIImagePNGRepresentation函數(shù)將圖像轉(zhuǎn)換為不同的表示形式。
3)獲取粘貼板對(duì)象休溶。在許多情況下代赁,這是一般的粘貼板,您可以通過(guò)generalPasteboard類(lèi)方法獲得兽掰。
4)為寫(xiě)入粘貼板項(xiàng)目的每個(gè)數(shù)據(jù)表示分配一個(gè)合適的UTI芭碍。有關(guān)此主題的討論,請(qǐng)參閱Pasteboard Concepts孽尽。
-
5)將數(shù)據(jù)寫(xiě)入每個(gè)表示類(lèi)型的第一個(gè)粘貼板項(xiàng):
- 要編寫(xiě)數(shù)據(jù)對(duì)象豁跑,請(qǐng)將setData:forPasteboardType:消息發(fā)送到粘貼板對(duì)象。
- 要編寫(xiě)屬性列表對(duì)象泻云,請(qǐng)將setValue:forPasteboardType:消息發(fā)送到pasteboard對(duì)象艇拍。
6)如果命令為Cut
(cut:method)
,則從應(yīng)用程序的數(shù)據(jù)模型中刪除選擇所代表的對(duì)象并更新視圖宠纯。
Listing 5-1
顯示了copy:
和cut:
方法的實(shí)現(xiàn)卸夕。 cut:方法調(diào)用copy:方法,然后從視圖和數(shù)據(jù)模型中刪除所選對(duì)象婆瓜。請(qǐng)注意快集,copy:方法存檔自定義對(duì)象以獲取可以傳遞給setData:forPasteboardType:
中的粘貼板的NSData對(duì)象。
// Listing 5-1 Copying and cutting operations
- (void)copy:(id)sender {
UIPasteboard *gpBoard = [UIPasteboard generalPasteboard];
ColorTile *theTile = [self colorTileForOrigin:currentSelection];
if (theTile) {
NSData *tileData = [NSKeyedArchiver archivedDataWithRootObject:theTile];
if (tileData)
[gpBoard setData:tileData forPasteboardType:ColorTileUTI];
}
}
- (void)cut:(id)sender {
[self copy:sender];
ColorTile *theTile = [self colorTileForOrigin:currentSelection];
if (theTile) {
CGPoint tilePoint = theTile.tileOrigin;
[tiles removeObject:theTile];
CGRect tileRect = [self rectFromOrigin:tilePoint inset:TILE_INSET];
[self setNeedsDisplayInRect:tileRect];
}
}
Pasting the Selection - 粘貼選擇
當(dāng)用戶點(diǎn)擊編輯菜單的粘貼命令時(shí)廉白,系統(tǒng)會(huì)調(diào)用實(shí)現(xiàn)它的響應(yīng)器對(duì)象的paste:
方法个初。通常第一個(gè)響應(yīng)者 - 您的自定義視圖 - 實(shí)現(xiàn)此方法,但如果第一個(gè)響應(yīng)者沒(méi)有實(shí)現(xiàn)它猴蹂,則消息以通常的方式傳遞給響應(yīng)者院溺。 paste:
方法由UIResponderStandardEditActions
非正式協(xié)議聲明。
在響應(yīng)paste:
消息時(shí)磅轻,您可以使用應(yīng)用支持的表示形式從粘貼板中讀取對(duì)象珍逸。然后將粘貼的對(duì)象添加到應(yīng)用程序的數(shù)據(jù)模型,并在用戶指示的位置的視圖中顯示新對(duì)象聋溜。此操作涉及以下步驟(假設(shè)單個(gè)粘貼板項(xiàng)目):
1)獲取粘貼板對(duì)象谆膳。在許多情況下,這是一般的粘貼板撮躁,您可以通過(guò)generalPasteboard類(lèi)方法獲得漱病。
2)通過(guò)調(diào)用containsPasteboardTypes:方法或pasteboardTypes方法,然后檢查返回的類(lèi)型數(shù)組,驗(yàn)證第一個(gè)粘貼板項(xiàng)目是否包含應(yīng)用程序可以處理的表示形式的數(shù)據(jù)杨帽。請(qǐng)注意漓穿,您應(yīng)該已經(jīng)在canPerformAction:withSender:的實(shí)現(xiàn)中執(zhí)行了此步驟。
-
3)如果粘貼板的第一項(xiàng)包含應(yīng)用程序可以處理的數(shù)據(jù)睦尽,請(qǐng)調(diào)用以下方法之一來(lái)讀取它:
- dataForPasteboardType:如果要讀取的數(shù)據(jù)封裝在NSData對(duì)象中器净。
- valueForPasteboardType:如果要讀取的數(shù)據(jù)封裝在屬性列表對(duì)象中(請(qǐng)參閱Copying and Cutting the Selection)。
4)將對(duì)象添加到應(yīng)用程序的數(shù)據(jù)模型中当凡。
5)在用戶指定的用戶界面中顯示對(duì)象的表示形式山害。
Listing 5-2
是paste:
方法的一個(gè)實(shí)現(xiàn)示例。它與組合就剪切和復(fù)制方法相反沿量。自定義視圖首先查看常規(guī)粘貼板是否保存其自定義數(shù)據(jù)表示形式浪慌;如果是這樣,它會(huì)從粘貼板讀取數(shù)據(jù)朴则,將其添加到應(yīng)用程序的數(shù)據(jù)模型中权纤,并標(biāo)記自身的一部分 - 當(dāng)前選擇 - 用于重繪。
// Listing 5-2 Pasting data to a selection
- (void)paste:(id)sender {
UIPasteboard *gpBoard = [UIPasteboard generalPasteboard];
NSArray *pbType = [NSArray arrayWithObject:ColorTileUTI];
ColorTile *theTile = [self colorTileForOrigin:currentSelection];
if (theTile == nil && [gpBoard containsPasteboardTypes:pbType]) {
NSData *tileData = [gpBoard dataForPasteboardType:ColorTileUTI];
ColorTile *theTile = (ColorTile *)[NSKeyedUnarchiver unarchiveObjectWithData:tileData];
if (theTile) {
theTile.tileOrigin = self.currentSelection;
[tiles addObject:theTile];
CGRect tileRect = [self rectFromOrigin:currentSelection inset:TILE_INSET];
[self setNeedsDisplayInRect:tileRect];
}
}
}
Ending an Operation - 結(jié)束操作
當(dāng)您執(zhí)行cut:乌妒,copy:
或paste:
命令返回時(shí)汹想,編輯菜單會(huì)自動(dòng)隱藏。 如果需要撤蚊,您可以以編程方式使其可見(jiàn)古掏。 有關(guān)更多信息,請(qǐng)參閱Dismissing the Edit Menu侦啸。
后記
本篇主要講述了復(fù)制槽唾、剪切和粘貼操作,感興趣的給個(gè)贊或者關(guān)注~~~