ios label 簡單的長按復制文本信息


在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能。網上有很多種給Label添加長按復制功能的方法,這里我就寫分享一種簡單的寫法,直接在控制器Label需要使用的地方直接實現,也不再進行封裝處理。

首先,蘋果系統中支持復制功能的控件只有三種:UItextView、UItextfield、UIWebView,所以要想讓UILabel支持復制功能,只能給UILabel添加點擊手勢(比如:長按手勢)才能復制內容。

長按復制彈出來的是一個UImenucontroller,那就需要給UILabel添加一個長按的手勢識別(UILongPressGestureRecognizer),並在系統識別出這個手勢之后添加相關的相應動作(action)。在這之前,需要讓UILabel成為第一響應者,但是需要注意的是,不是所有的UILabel都能成為第一響應者,這就需要重寫canBecomeFirstResponder方法,獲取到UILabel的關聯對象numberToSwitchCopy的布爾值,根據這個布爾值來決定UILabel是否能成為第一響應者,如果沒有設置這個關聯對象的UILabel是不可能成為第一響應者的。

系統識別到長按動作之后,就執行處理長按事件的方法,在這個方法中,使UILabel成為第一響應者(UIMenuController的要求,要顯示UIMenuController對象的UIView必須為當前UIWindow的第一響應者),然后為UIMenuController設置UIMenuItem對象,設置顯示區域,最后將UIMenuController設置為可見。與此同時,如果只在UImenuitem的action中寫了方法名但是沒有實現action方法,UImenucontroller也是不會顯示出來的。

在copy:方法中,完成將選中的文字復制到系統的粘貼板中,首先獲取系統的粘貼板UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];,然后將所需復制的文字賦值給pasteBoard的String屬性。需要注意的是pasteBoard的String屬性只能接受NSString類型的值,如果UILabel中的文字是NSAtrributedString,就要轉換成NSString再賦值。

說了這么多,直接附上一個小例子,以便參考研究。我直接在控制器里面直接給Label添加長按手勢復制內容的,這里附上的是控制器的類文件。

.h 文件:

#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface TestViewController : UIViewController
@end

.m文件:

#import "TestViewController.h"
@interface TestViewController ()
@property (nonatomic,strong) UILabel *aaa;
@end
@implementation TestViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self initUI];
}

- (void)initUI {
self.aaa = [[UILabel alloc] initWithFrame:CGRectMake(0, 300+45+5, 300, 20)];
self.aaa.backgroundColor = [UIColor yellowColor];
self.aaa.text = @"三掌櫃666";

//UILabel自身不能接收事件,需要開發者給它添加長按事件
self.aaa.userInteractionEnabled = YES;
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPre:)];
[self.aaa addGestureRecognizer:longPress];
[self.view addSubview:self.aaa];

}
// 使label能夠成為響應事件,為了能接收到事件(能成為第一響應者)
- (BOOL)canBecomeFirstResponder{
return YES;
}
// 可以控制響應的方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
return (action == @selector(copy:));
}
//針對響應方法的實現,最主要的復制的兩句代碼
- (void)copy:(id)sender{

//UIPasteboard:該類支持寫入和讀取數據,類似剪貼板
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
pasteBoard.string = self.aaa.text;
}
// 處理長按事件
- (void)longPre:(UILongPressGestureRecognizer *)recognizer{
[self becomeFirstResponder]; // 用於UIMenuController顯示,缺一不可

//UIMenuController:可以通過這個類實現點擊內容,或者長按內容時展示出復制等選擇的項,每個選項都是一個UIMenuItem對象
UIMenuItem *copyLink = [[UIMenuItem alloc] initWithTitle:@"復制" action:@selector(copy:)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:copyLink, nil]];
[[UIMenuController sharedMenuController] setTargetRect:self.aaa.frame inView:self.aaa.superview];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}

下面是局部運行效果:

 

補充知識:

(一)、UIResponderStandardEditActions:這是蘋果給NSObject寫的一個分類,其中包含了我們常用的復制,粘貼,全選等方法.

1  - (void)cut:(nullable id)sender NS_AVAILABLE_IOS(3_0);
2  - (void)copy:(nullable id)sender NS_AVAILABLE_IOS(3_0);
3  - (void)paste:(nullable id)sender NS_AVAILABLE_IOS(3_0);
4  - (void)select:(nullable id)sender NS_AVAILABLE_IOS(3_0);
5  - (void)selectAll:(nullable id)sender NS_AVAILABLE_IOS(3_0);
6  - (void)delete:(nullable id)sender NS_AVAILABLE_IOS(3_2);

當我們選中彈出的item的時候,系統會調用上面對應的方法,進行對應的操作。

(二)、剪貼板中可以放置的內容(除了字符串,還可以拷貝圖片、URL等).

1.  UIPasteboardTypeListString 字符串數組, 包含kUTTypeUTF8PlainText
2.  UIPasteboardTypeListURL URL數組,包含kUTTypeURL
3.  UIPasteboardTypeListImage 圖形數組, 包含kUTTypePNG 和kUTTypeJPEG
4.  UIPasteboardTypeListColor 顏色數組


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM