IOS 為UILabel添加長按復制功能

IOS 為UILabel添加長按復制功能

?

在iOS中下面三個控件,自身就有復制-粘貼的功能:

?1、UITextView

?2、UITextField

?3、UIWebView

?

UIKit framework提供了幾個類和協議方便我們在自己的應用程序中實現剪貼板的功能。

?1、UIPasteboard:我們可以向其中寫入數據,也可以讀取數據
?2、UIMenuController:顯示一個快捷菜單,用來展示復制、剪貼、粘貼等選擇的項。
?3、UIResponder中的 canPerformAction:withSender:用于控制哪些命令顯示在快捷菜單中。
?4、當快捷菜單上的命令點擊的時候,UIResponderStandardEditActions將會被調用。

?下面這些項能被放置到剪貼板中
?1、UIPasteboardTypeListString?— ? 字符串數組, 包含kUTTypeUTF8PlainText
?2、UIPasteboardTypeListURL?— ? URL數組,包含kUTTypeURL
?3、UIPasteboardTypeListImage?— ? 圖形數組, 包含kUTTypePNG 和kUTTypeJPEG
?4、UIPasteboardTypeListColor?— ? 顏色數組

?剪貼板的類型分為兩種:
?系統級:使用UIPasteboardNameGeneral和UIPasteboardNameFind,系統級應用程序關閉,或者卸載的數據不會丟失。

?應用程序級:通過設置,可以讓數據在應用程序關閉之后仍然保存在剪貼板中,但是應用程序卸載之后數據就會失去。我們可用通過pasteboardWithName:create:來創建。

?

例子如下:

有時候我們可能需要復制UILabel上的文本,或者UIImageView的圖片,而UILabel和UIImageView默認是不響應Touch事件的,也無法復制,那么我們就需要自己實現一個可復制的UILabel。新添加一個類繼承自UILabel:

@interface UICopyLabel : UILabel  
@end  #import "UICopyLabel.h"  
@implementation UICopyLabel  
@end  

?

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

-(BOOL)canBecomeFirstResponder
{  return YES;  
}  

?

?還需要針對復制的操作覆蓋兩個方法:?

// 可以響應的方法
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{  return (action == @selector(copy:));  
}  

?

?

//針對于響應方法的實現  
-(void)copy:(id)sender
{  UIPasteboard *pboard = [UIPasteboard generalPasteboard];  pboard.string = self.text;  
}  

?

有了以上三個方法,我們就能處理copy了,當然,在能接收到事件的情況下:

?

//UILabel默認是不接收事件的,我們需要自己添加touch事件  
-(void)attachTapHandler
{  self.userInteractionEnabled = YES;  //用戶交互的總開關  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];  
}  

?

我們已經可以接收到事件了!由于我在上方將tap數設為2,所以需要雙擊才能捕獲,接下來,我們需要處理這個tap,以便讓菜單欄彈出來:

-(void)handleTap:(UIGestureRecognizer*) recognizer
{  [self becomeFirstResponder];UIMenuItem *copyLink = [[[UIMenuItemalloc] initWithTitle:@"復制"action:@selector(copy:)]autorelease];[[UIMenuControllersharedMenuController] setMenuItems:[NSArrayarrayWithObjects:copyLink, nil]];[[UIMenuControllersharedMenuController] setTargetRect:self.frameinView:self.superview];[[UIMenuControllersharedMenuController] setMenuVisible:YESanimated: YES];
}  

?這樣一來,一個可復制的UILabel就誕生了!它能處理接收點擊、彈出菜單欄、處理copy,這是一個很普通的可復制控件。

接下來我們做一個可復制的UIImageView,創建一個新的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有系統級別和應用級別兩種類型,所以不僅可以在應用程序內通信,還能在應用程序間通信,比如我復制一個url,然后打開safari,粘貼到地址欄去,而我們可以在應用程序間通信、共享數據。

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

//需要提供一個唯一的名字,一般使用倒寫的域名:com.mycompany.myapp.pboard  
//后面的參數表示,如果不存在,是否創建一個  
UIPasteboard *pb = [UIPasteboard pasteboardWithName:@"testBoard" create:YES];  

使用這個粘貼板,我們可以把文本存進去,然后在另一個app里面讀出來,一些常用的類型已經被設置為屬性了:?


除此之外,如果是能夠轉換成plist的數據類型(NSString, NSArray, NSDictionary, NSDate, NSNumber 和 NSURL),我們可以調用setValue:forPasteboardType:方法去存儲數據,其他類型只能調用setData:forPasteboardType:方法(plist數據類型也可使用),類似于這樣:

?

//存儲數據
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,這是一個統一類型標識符(Uniform Type Identifier ?UTI),能幫助app獲取自己能處理的數據。比如你只能處理文本的粘貼,那給你一個UIImage顯然是無用的。你可以使用公用的UTI,也可以使用任意字符,蘋果建議使用倒寫的域名加上類型名:com.myCompany.myApp.myType。

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

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

相關文章

navicat 的查詢功能

navicat的查詢的位置在&#xff1a; 在編輯器界面寫代碼&#xff0c;代碼完成后點左上角的運行。 代碼&#xff1a; create&#xff08;創建&#xff09; table&#xff08;一個表&#xff09; <xxx>尖括號內的內容必填——我要創建并查詢一個名叫做xxx的表 &#xff08…

c++ sleep函數_Linux 多線程應用中如何編寫安全的信號處理函數

關于代碼的可重入性&#xff0c;設計開發人員一般只考慮到線程安全&#xff0c;異步信號處理函數的安全卻往往被忽略。本文首先介紹如何編寫安全的異步信號處理函數&#xff1b;然后舉例說明在多線程應用中如何構建模型讓異步信號在指定的線程中以同步的方式處理。Linux 多線程…

css特殊情況

如果一個父級div和一個子級div&#xff0c;要給父級div加&#xff08;opacity&#xff09;透明度那子級div也會繼承父級元素的透明度。那給父級元素加透明度就不用opacity加透明度&#xff0c;使用background:rgba(120,120,120,0.7);實現效果&#xff0c;r,g,b分別代表紅&#…

CoreAnimation (CALayer 動畫)

CoreAnimation基本介紹&#xff1a; CoreAnimation動畫位于iOS框架的Media層CoreAnimation動畫實現需要添加QuartzCore.FrameworkCoreAnimation基本上是LayerAnimationCoreAnimation分類&#xff1a; CoreAnimation作用&#xff1a; CoreAnimation CALayer基本介紹 CALayer的常…

匯編為什么分段執行總是執行不了_iOS匯編教程(六)CPU 指令重排與內存屏障...

系列文章iOS 匯編入門教程(一)ARM64 匯編基礎iOS 匯編入門教程(二)在 Xcode 工程中嵌入匯編代碼iOS 匯編入門教程(三)匯編中的 Section 與數據存取iOS 匯編教程(四)基于 LLDB 動態調試快速分析系統函數的實現iOS 匯編教程(五)Objc Block 的內存布局和匯編表示前言具有 ARM 體系…

GD32 使用stm32 固件庫

1、 系統 1) 晶振起振區別 描述&#xff1a;啟動時間&#xff0c;GD32 與STM32 啟動時間都是2ms&#xff0c;實際上GD 的執行效率快&#xff0c;所以ST 的HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)是2ms&#xff0c;但是這個宏定義值在GD 上時間就更加短了&#xff0c;所以要加大…

干將莫邪

干將莫邪也為凡鐵鑄成&#xff0c;只是善加鍛造、融入心神&#xff0c;而成上古神兵。寶劍從來都是雙刃&#xff0c;正邪之道&#xff0c;存乎一心。

js反混淆還原工具_SATURN反混淆框架

本文為看雪論壇精華文章看雪論壇作者ID&#xff1a;夢野間摘要&#xff1a;近幾年&#xff0c;軟件的混淆強度一直在不斷提升。基于編譯器的混淆已經成為業界事實上的標準&#xff0c;最近的一些論文也表明軟件的保護方式使用的是編譯器級別的混淆。在這篇文章中&#xff0c;我…

android 彈起鍵盤把ui頂上去的解決辦法

鍵盤輸入框上面的ui布局必須為Relative相對布局。然后設置 <activityandroid:name".activity.HomeActivity"Android:windowSoftInputMode"adjustPan|stateHidden"></activity>轉載于:https://www.cnblogs.com/zhaoleigege/p/5925831.html

python 多線程并發_尋找python大神!!!python如何多線程并發?

不是大神。嘗試回答一下。 首先解釋下什么叫做線程&#xff0c;什么叫做進程&#xff0c;在解釋這兩個概念前&#xff0c;我們還需要明白什么叫做GIL全局解釋器鎖。GIL 全局解釋器鎖&#xff1a; GIL(全局解釋器鎖&#xff0c;GIL 只有cpython有)&#xff1a;在同一個時刻&…

Nginx/Apache發大招

導讀網站程序的上傳目錄通常是不需要PHP執行解釋權限&#xff0c;通過限制目錄的PHP執行權限可以提網站的安全性&#xff0c;減少被攻擊的機率。下面和大家一起分享下如何在Apache和Nginx禁止上傳目錄里PHP的執行權限。 Apache下禁止指定目錄運行PHP腳本在虛擬主機配置文件中增…

第二輪沖刺-Runner站立會議08

今天完成的內容&#xff1a;簡單的做了一下主界面的美化和日歷界面的美化 遇到的問題&#xff1a;美化按鈕還不能自己自定義按鈕 如何解決&#xff1a;暫無思路 明天將要進行的內容&#xff1a;調試bug 轉載于:https://www.cnblogs.com/Againzg/p/5544301.html

STM32串口通信中使用printf發送數據配置方法 開發環境 Keil

STM32串口通信中使用printf發送數據配置方法(開發環境 Keil RVMDK) 已有 12456 次閱讀2011-6-29 23:29 | 在STM32串口通信程序中使用printf發送數據&#xff0c;非常的方便。可在剛開始使用的時候總是遇到問題&#xff0c;常見的是硬件訪真時無法進入main主函數&#xff0c;其實…

dmp文件查看表空間_innoDb文件

一&#xff0e;文件總體概述InnoDb文件主要有以下文件1. 參數文件&#xff1a;啟動需要的各種參數作2. 日志文件&#xff1a;記錄mysql實例某種條件做出的響應而寫入的文件&#xff0c;如錯誤日志、二進制日志、慢查詢日志、查詢日志等3. Socket文件&#xff1a;連接需要的文件…

論文筆記之:Deep Attention Recurrent Q-Network

Deep Attention Recurrent Q-Network 5vision groups 摘要&#xff1a;本文將 DQN 引入了 Attention 機制&#xff0c;使得學習更具有方向性和指導性。&#xff08;前段時間做一個工作打算就這么干&#xff0c;誰想到&#xff0c;這么快就被這幾個孩子給實現了&#xff0c;自愧…

Codeforces Round #354 (Div. 2)

貪心 A Nicholas and Permutation #include <bits/stdc.h>typedef long long ll; const int N 1e5 5; int a[105]; int pos[105];int main() {int n;scanf ("%d", &n);for (int i1; i<n; i) {scanf ("%d", ai);pos[a[i]] i;}int ans abs …

linux c程序中內核態與用戶態內存存儲問題

Unix/Linux的體系架構 如上圖所示&#xff0c;從宏觀上來看&#xff0c;Linux操作系統的體系架構分為用戶態和內核態&#xff08;或者用戶空間和內核&#xff09;。內核從本質上看是一種軟件——控制計算機的硬件資源&#xff0c;并提供上層應用程序運行的環境。用戶態即上層應…

線程自動退出_C++基礎 多線程筆記(一)

join & detachjoin和detach為最基本的用法&#xff0c;join可以使主線程&#xff08;main函數&#xff09;等待子線程&#xff08;自定義的function_1函數&#xff09;完成后再退出程序&#xff0c;而detach可以使子線程與主線程毫無關聯的獨立運行&#xff0c;當主線程執行…

WEB在線預覽PDF

這是我在博客園發表的第一篇文章。以后會陸續把在線預覽其他格式文檔的解決方案發表出來。 解決思路&#xff1a;把pdf轉換成html顯示。 在線預覽pdf我暫時了解3種解決方案&#xff0c;歡迎大家補充。 方案一&#xff1a; 利用pdf2html軟件將PDF轉換成HTML。 用法: PDF2HTML [選…

[算法]判斷一個數是不是2的N次方

如果一個數是2^n&#xff0c;說明這個二進制里面只有一個1。除了1. a (10000)b a-1 (01111)b a&(a-1) 0。 如果一個數不是2^n&#xff0c; 說明它的二進制里含有多一個1。 a (1xxx100)b a-1(1xxx011)b 那么 a&(a-1)就是 (1xxx000)b&#xff0c; 而不會為0。 所以可…