在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. Oracle 12C -- 预定义audit policies

    在12C中,预定义了三种审计策略:ora_secureconfig,ora_database_parameter,ora_account_mgmt可以通过脚本$ORACLE_HOME/rdbms/ad ...

  3. Oracle 12C -- in-database archiving

    在同一张表中,通过将row置为inactive状态来实现数据的归档.数据库中,可以对那些inactive row进行压缩优化.在实现归档的同时,应用可以被限制只访问那些active状态的数据.默认情况 ...

  4. Linux中断 - 综述

    一.前言 一个合格的linux驱动工程师需要对kernel中的中断子系统有深刻的理解,只有这样,在写具体driver的时候才能: 1.正确的使用linux kernel提供的的API,例如最著名的re ...

  5. Material DesignDrawerLayout的旋转箭头的实现方式。

    实际上,官方已经提供了实现方法,可是,有非常多捞偏门的教程,也有非常优秀的第三方.写出来.供还没找到的同学參考. 前提是:你对android.support.v7.widget.Toolbar已经有过 ...

  6. Android Support Library 23.2介绍(翻译自官方文档)

    Android Support Library 23.2 (译者注:本文标注了部分文字链接,但须要***,要查看全部链接.请查看sukey=014c68f407f2d3e181b6b5e665f26a ...

  7. sqlserver数据库18456错误怎么解决?

    1.以windows验证模式进入数据库管理器. 2.右击sa,选择属性: 在常规选项卡中,重新填写密码和确认密码(改成个好记的).把强制实施密码策略去掉. 3.点击状态选项卡:勾选授予和启用.然后确定 ...

  8. Maven pom.xml中的元素modules、parent、properties以及import(转)

    前言 项目中用到了maven,而且用到的内容不像利用maven/eclipse搭建ssm(spring+spring mvc+mybatis)用的那么简单:maven的核心是pom.xml,那么我就它 ...

  9. Windows8.1远程桌面时提示凭据不工作的解决方案

    本人两台电脑都是win8.1.首先确认以下三点: 1.密码没有错 2.用户连接没有达到上线(只有我一个人尝试连) 3.该用户已开启远程连接 此时还说凭据不工作的原因是域的问题,因为mstsc默认使用M ...

  10. Processing支持中文显示

    Processing 默认不支持中文,中文显示成框框,我使用的版本是:2.2.1,进行如下设置,并且重启processing就可以支持中文了: 可以看到中文了: