iOS 為UILabel和UIImageView添加長按復(fù)制功能

在iOS中下面三個控件啰扛,自身就有復(fù)制-粘貼的功能:

1妖谴、UITextView

2谜喊、UITextField

3枢赔、UIWebView

UIKit framework提供了幾個類和協(xié)議方便我們在自己的應(yīng)用程序中實現(xiàn)剪貼板的功能。

1括授、UIPasteboard:我們可以向其中寫入數(shù)據(jù)坞笙,也可以讀取數(shù)據(jù)

2、UIMenuController:顯示一個快捷菜單荚虚,用來展示復(fù)制薛夜、剪貼、粘貼等選擇的項版述。

3梯澜、UIResponder中的 canPerformAction:withSender:用于控制哪些命令顯示在快捷菜單中。

4渴析、當(dāng)快捷菜單上的命令點擊的時候晚伙,UIResponderStandardEditActions將會被調(diào)用。

下面這些項能被放置到剪貼板中

1俭茧、UIPasteboardTypeListString —? 字符串?dāng)?shù)組, 包含kUTTypeUTF8PlainText

2咆疗、UIPasteboardTypeListURL —? URL數(shù)組,包含kUTTypeURL

3母债、UIPasteboardTypeListImage —? 圖形數(shù)組, 包含kUTTypePNG 和kUTTypeJPEG

4民傻、UIPasteboardTypeListColor —? 顏色數(shù)組

剪貼板的類型分為兩種:

系統(tǒng)級:使用UIPasteboardNameGeneral和UIPasteboardNameFind,系統(tǒng)級應(yīng)用程序關(guān)閉场斑,或者卸載的數(shù)據(jù)不會丟失漓踢。

應(yīng)用程序級:通過設(shè)置,可以讓數(shù)據(jù)在應(yīng)用程序關(guān)閉之后仍然保存在剪貼板中漏隐,但是應(yīng)用程序卸載之后數(shù)據(jù)就會失去喧半。我們可用通過pasteboardWithName:create:來創(chuàng)建。

UILabel

例子如下:

有時候我們可能需要復(fù)制UILabel上的文本青责,或者UIImageView的圖片挺据,而UILabel和UIImageView默認是不響應(yīng)Touch事件的,也無法復(fù)制脖隶,那么我們就需要自己實現(xiàn)一個可復(fù)制的UILabel扁耐。

新添加一個類繼承自UILabel:

@interface UICopyLabel : UILabel

@end

#import "UICopyLabel.h"

@implementation UICopyLabel

@end

為了能接收到事件(能成為第一響應(yīng)者),我們需要覆蓋一個方法:

-(BOOL)canBecomeFirstResponder

{

return YES;

}

還需要針對復(fù)制的操作覆蓋兩個方法:

// 可以響應(yīng)的方法

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender

{

return (action == @selector(copy:));

}

//針對于響應(yīng)方法的實現(xiàn)

-(void)copy:(id)sender

{

UIPasteboard *pboard = [UIPasteboard generalPasteboard];

pboard.string = self.text;

}

有了以上三個方法产阱,我們就能處理copy了婉称,當(dāng)然,在能接收到事件的情況下:

//UILabel默認是不接收事件的,我們需要自己添加touch事件

-(void)attachTapHandler

{

self.userInteractionEnabled = YES;? //用戶交互的總開關(guān)

UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];

touch.numberOfTapsRequired = 2;

[self addGestureRecognizer:touch];

[touch release];

}

//綁定事件

- (id)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self)

{

[self attachTapHandler];

}

return self;

}

//同上

-(void)awakeFromNib

{

[super awakeFromNib];

[self attachTapHandler];

}

我們已經(jīng)可以接收到事件了王暗!由于我在上方將tap數(shù)設(shè)為2悔据,所以需要雙擊才能捕獲,

接下來俗壹,我們需要處理這個tap科汗,以便讓菜單欄彈出來:

-(void)handleTap:(UIGestureRecognizer*) recognizer

{

[self becomeFirstResponder];

UIMenuItem *copyLink = [[[UIMenuItemalloc] initWithTitle:@"復(fù)制"

action:@selector(copy:)]autorelease];

[[UIMenuControllersharedMenuController] setMenuItems:[NSArrayarrayWithObjects:copyLink, nil]];

[[UIMenuControllersharedMenuController] setTargetRect:self.frameinView:self.superview];

[[UIMenuControllersharedMenuController] setMenuVisible:YESanimated: YES];

}

這樣一來,一個可復(fù)制的UILabel就誕生了绷雏!它能處理接收點擊头滔、彈出菜單欄、處理copy涎显,這是一個很普通的可復(fù)制控件坤检。

UIImageView

接下來我們做一個可復(fù)制的UIImageView,創(chuàng)建一個新的viewController棺禾,放兩個imageView缀蹄,默認顯示不同的圖:

然后把上面的代碼直接拷過來峭跳,改三個地方:

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender

{

return (action == @selector(copy:) || action == @selector(paste:));

}

-(void)copy:(id)sender

{

UIPasteboard *pboard = [UIPasteboard generalPasteboard];

pboard.image = self.image;

}

-(void)paste:(id)sender

{

UIPasteboard *pboard = [UIPasteboard generalPasteboard];

self.image = pboard.image;

}

UIPasteboard有系統(tǒng)級別和應(yīng)用級別兩種類型膘婶,所以不僅可以在應(yīng)用程序內(nèi)通信,還能在應(yīng)用程序間通信蛀醉,比如我復(fù)制一個url悬襟,然后打開safari,粘貼到地址欄去拯刁,而我們可以在應(yīng)用程序間通信脊岳、共享數(shù)據(jù)。

在PasteBoardWrite里面點“寫入”后把textField中的文本寫入粘貼板垛玻,然后切換到PasteBoardRead的時候顯示出來割捅。如果我們的粘貼板只想給“自己人”用的話,就不能用系統(tǒng)的通用粘貼板帚桩,需要我們自己創(chuàng)建一個:

//需要提供一個唯一的名字亿驾,一般使用倒寫的域名:com.mycompany.myapp.pboard

//后面的參數(shù)表示,如果不存在账嚎,是否創(chuàng)建一個

UIPasteboard *pb = [UIPasteboard pasteboardWithName:@"testBoard" create:YES];

使用這個粘貼板莫瞬,我們可以把文本存進去,然后在另一個app里面讀出來郭蕉,一些常用的類型已經(jīng)被設(shè)置為屬性了:

除此之外疼邀,如果是能夠轉(zhuǎn)換成plist的數(shù)據(jù)類型(NSString, NSArray, NSDictionary, NSDate, NSNumber 和 NSURL),我們可以調(diào)用setValue:forPasteboardType:方法去存儲數(shù)據(jù)召锈,其他類型只能調(diào)用setData:forPasteboardType:方法(plist數(shù)據(jù)類型也可使用)旁振,類似于這樣:

//存儲數(shù)據(jù)

NSDictionary *dict = [NSDictionary dictionaryWithObject:textField.text forKey:@"content"];

NSData *dictData = [NSKeyedArchiver archivedDataWithRootObject:dict];

[pb setData:dictData forPasteboardType:@"myType"];

//獲取就類似于這樣:

UIPasteboard *pb = [UIPasteboard pasteboardWithName:@"testBoard" create:YES];

NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:[pb dataForPasteboardType:@"myType"]];

caption.text = [dict objectForKey:@"content"];

上面提到了一個PasteboardType, 這是一個統(tǒng)一類型標識符(Uniform Type Identifier? UTI),能幫助app獲取自己能處理的數(shù)據(jù)。比如你只能處理文本的粘貼规求,那給你一個UIImage顯然是無用的筐付。你可以使用公用的UTI,也可以使用 任意字符阻肿,蘋果建議使用倒寫的域名加上類型名:com.myCompany.myApp.myType瓦戚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丛塌,隨后出現(xiàn)的幾起案子较解,更是在濱河造成了極大的恐慌,老刑警劉巖赴邻,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件印衔,死亡現(xiàn)場離奇詭異,居然都是意外死亡姥敛,警方通過查閱死者的電腦和手機奸焙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彤敛,“玉大人与帆,你說我怎么就攤上這事∧” “怎么了玄糟?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長袄秩。 經(jīng)常有香客問我阵翎,道長,這世上最難降的妖魔是什么之剧? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任郭卫,我火速辦了婚禮,結(jié)果婚禮上背稼,老公的妹妹穿的比我還像新娘贰军。我一直安慰自己,他們只是感情好雇庙,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布谓形。 她就那樣靜靜地躺著,像睡著了一般疆前。 火紅的嫁衣襯著肌膚如雪寒跳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天竹椒,我揣著相機與錄音童太,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛书释,可吹牛的內(nèi)容都是我干的翘贮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼爆惧,長吁一口氣:“原來是場噩夢啊……” “哼狸页!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扯再,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤芍耘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熄阻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斋竞,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年秃殉,在試婚紗的時候發(fā)現(xiàn)自己被綠了坝初。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡钾军,死狀恐怖鳄袍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巧颈,我是刑警寧澤畦木,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布袖扛,位于F島的核電站砸泛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛆封。R本人自食惡果不足惜唇礁,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惨篱。 院中可真熱鬧盏筐,春花似錦、人聲如沸砸讳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽簿寂。三九已至漾抬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間常遂,已是汗流浹背纳令。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人平绩。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓圈匆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捏雌。 傳聞我的和親對象是個殘疾皇子跃赚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容