在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. React(0.13) 定义一个多选的组件

    <!DOCTYPE html> <html> <head> <title>React JS</title> <script src=& ...

  2. 定制jQuery File Upload为微博式单文件上传

    日志未经声明,均为AlloVince原创.版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可. jQuery File Upload是一个非常优秀的上传组件,主要使用了XHR作为上传方 ...

  3. 为什么 c = tf.matmul(a, b) 不立即执行矩阵乘法?

    在 TensorFlow Python API 中,a.b 和 c 是  tf.Tensor  对象.Tensor 对象是指令结果的符号句柄,但它实际上并不存放指令的输出值.相反,TensorFlow ...

  4. mysql主从复制配置问题

    一,基本步骤 1,创建在主从数据上都创建复制账号,权限选上super, replication slave , replication master(选上这个可以方便从库变成主库): 2,配置主库和备 ...

  5. gitlab hook declined错误

    在向gitlab提交工程的时候,出现错误提示: remote: GitLab: You are not allowed to access master!remote: error: hook dec ...

  6. Access数据库中日期时间类型的时间段查询

    例: select  ID,预设点,备注  from 预设点派车预警 where ( 到达时间>=#2013-01-01 12:12:12# and 到达时间<=#2016-01-24 2 ...

  7. Windows搭建测试RabbitMq遇到的问题

    报错: d:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.5\sbin>rabbitmq-plugins eble rabbitmq_ma ...

  8. WPF中动态改变控件显示位置

    转自 http://blog.csdn.net/lassewang/article/details/6928897 测试环境: Windows XP/Windows 7 开发环境: Microsoft ...

  9. 高精度运算库gmp

    网址:www.gmplib.org 我下载的是 6.1.2版本:https://gmplib.org/download/gmp/gmp-6.1.2.tar.bz2 执行操作如下: 1. tar -jv ...

  10. [svc][dhcp]关于无线ap自动发现选项dhcp option43配置

    有人问到option43的问题,查了点资料.总结了下win和linux的option43的配置: windows2003 http://www.h3c.com.cn/Service/Channel_S ...