在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 颜色数组

ios label 简单的长按复制文本信息的更多相关文章

  1. mui 点击长按复制文本

    项目需要长按复制文本内容,由于也没仔细研究过 mui 所以就直接百度.看到了 花落乱了流年 这篇博客 我就把这个博客的代码融合到自己的项目里,实现了复制的需求 直接上代码 单独写到了一个 js 文件. ...

  2. ios html5 长按复制文本

    以前做的项目,主要是针对ios的,安卓上面也没有测试. 原理其实是系统自带的功能,那时候借鉴的其他网站,没有试验通过document.execCommand("Copy"),别的j ...

  3. Wx-小程序-长按复制文本

    view: <text bindlongtap='copy' data-name='{{name}}'>{{item.name}}</text> js: copy(e) { v ...

  4. h5页面在ios机上禁止长按复制

    (注意,增加之后需要对input的另外设置,不然输入框无法输入)场景:H5出现一个按钮需要长按几秒展示动画的,如:skcs.net-tactic.com/wap/peace/index,这时就需要用到 ...

  5. 【咸鱼教程】Egret中可长按复制的文本(例如复制优惠码)

    一 实际效果二 实现原理三 源码下载 在egret中实现长按复制文本效果,一般用于复制优惠码什么的. 一 实际效果         二 实现原理 在egret的游戏元素都是绘制在canvas上的,我们 ...

  6. Clipboard 自动复制功能,ios复制失败,换方案 user-select: text ;长按复制 (ios 兼容,长按复制)

    Clipboard 自动复制功能,嵌套app内跳转的页面,ios 自动复制失败(该ios机子,微信,浏览器打开复制没有问题) 暂时换方案    user-select: text ;长按复制 (ios ...

  7. js兼容安卓和IOS的复制文本到剪切板

    1.在做点击按钮复制功能时遇到了小小的卡顿,此处遇到了两种系统手机的兼容性 / 复制后会对文本进行选中 / 输入法弹出 等.现将方法进行总结,如下代码很好对解决了以上问题,适用性强. 2.在文本此处使 ...

  8. 【转】TextView长按复制实现方法小结

    有这么一个需求,用户在浏览文本信息时希望长按信息就能弹出复制的选项方便保存或者在别的页面使用这些信息.类似的, 就像长按WebView或者EditText的内容就自动弹出复制选项. 这里面主要是2个特 ...

  9. [Android] TextView长按复制实现方法小结(转载)

    这是别人写的,既然别人总结过了,那我就不花时间研究这个了,但往后会补充一些使用经验之类的 原文地址:http://blog.csdn.net/stzy00/article/details/414778 ...

随机推荐

  1. 【C语言】练习2-8

     题目来源:<The C programming language>中的习题P38  练习2-1:  编写一个函数rightrot(x,n),该函数返回将x循环右移(即从最右端移除的位将从 ...

  2. easyui combobox 动态加载的两种方法

    reload 方法 javascript代码 //指定id 和 text 否则始终选择第一个 $('#contact_city').combobox({ valueField:'id', textFi ...

  3. Oracle 12C -- 不同容器之间切换

    1.使用connect SQL> show con_name; CON_NAME ------------------------------ CDB$ROOT SQL> connect ...

  4. xtrabackup-工作原理

    数据备份 xtrabackup是基于innodb的crash恢复功能之上的.它会拷贝innodb数据文件(这会导致数据不一致的),然后对文件执行crash恢复使其一致. 因为innodb维护了redo ...

  5. 关于switch语句中使用String类型的实现原理

    在Java 7 以后,switch语句可以用作String类型上. 从本质来讲,switch对字符串的支持,其实也是int类型值的匹配.它的实现原理如下: 通过对case后面的String对象调用ha ...

  6. Android长度单位详解(dp、sp、px、in、pt、mm、dip)

    Android中定义的dimension单位有以下这些:px(Pixels ,像素):对应屏幕上的实际像素点.in(Inches ,英寸):屏幕物理长度单位.mm(Millimeters ,毫米):屏 ...

  7. mysql 中只能使用 localhost 登录,用ip不能登陆

    解决办法 1 首先使用 localhost 登录 mysql 服务器,如果想要所用ip都可以登录本地mysql 服务器,执行以下授权命令 2 grant all privileges on *.* t ...

  8. 在ubuntu16安装supervisor 并 启动 .net core.

    1. 安装supervisor apt-get install supervisor 2.新建supervisor配置文件.使用以下命令在linux 命令行 echo_supervisord_conf ...

  9. elk 的报错和优化

    参数调整 elasticsearch.yml配置文件里面,调整http.max_content_length: 500mb 这个默认就100m 建议调大 之前有过报错 #如果队列满了logstash就 ...

  10. 【Android开发】交互界面布局详解

    原文:http://android.eoe.cn/topic/summary Android 的系统 UI 为构建您自己的应用提供了基础的框架.主要包括主屏幕 (Home Screen).系统 UI ...