iOS长按UIlabel实现可复制功能

前言

相信大家都知道在iOS中有三个控件自身是支持拷贝,粘贴的,如:UITextField,UITextView,UIWebView。但是,有时候我们会遇到需要长按UIlabel,弹出“复制”item,来实现可复制。那该怎么办呢?下面就来一起看看吧。

首先UIKit中提供给我们几个类

在开始之前,我们需要自定义一个WINCopyLabel继承UILable

- (instancetype)initWithFrame:(CGRect)frame {
 if (self = [super initWithFrame:frame]) {
  [self pressAction];
 }
 return self;
}
// 初始化设置
- (void)pressAction {
 self.userInteractionEnabled = YES;
 UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
 longPress.minimumPressDuration = 1;
 [self addGestureRecognizer:longPress];
}

1、UIResponder:通过这个类实现UILabel可以响应事件(我们知道UIlabel是不能成为响应者的,所以这里需要重写),控制需要响应的事件

 // 使label能够成为响应事件
 - (BOOL)canBecomeFirstResponder {
  return YES;
 }
 // 控制响应的方法
 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
  return action == @selector(customCopy:);
 }

2、UIPasteboard:该类支持写入和读取数据,类似剪贴板

 - (void)customCopy:(id)sender {
 UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
 pasteboard.string = self.text;
 }

3、UIMenuController:可以通过这个类实现在点击内容,或者长按内容时展示出复制、剪贴、粘贴等选择的项,每个选项都是一个UIMenuItem对象

- (void)longPressAction:(UIGestureRecognizer *)recognizer {
 [self becomeFirstResponder];
 UIMenuItem *copyItem = [[UIMenuItem alloc] initWithTitle:@"拷贝" action:@selector(customCopy:)];
 [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:copyItem, nil]];
 [[UIMenuController sharedMenuController] setTargetRect:self.frame inView:self.superview];
 [[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
}

补充:

一、UIResponderStandardEditActions:这是苹果给NSObject写的一个分类,其中包含了我们常用的复制,粘贴,全选等方法

 - (void)cut:(nullable id)sender  NS_AVAILABLE_IOS(3_0);
 - (void)copy:(nullable id)sender  NS_AVAILABLE_IOS(3_0);
 - (void)paste:(nullable id)sender  NS_AVAILABLE_IOS(3_0);
 - (void)select:(nullable id)sender  NS_AVAILABLE_IOS(3_0);
 - (void)selectAll:(nullable id)sender  NS_AVAILABLE_IOS(3_0);
 - (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开发者们有所帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • iOS中UILabel实现长按复制功能实例代码

    前言 网上有很多种给Label添加长按复制功能的方法,而在 UILabel 上实现长按复制,我用的是 UIMenuController.在 UITextView.UITextField 中,已经自带了这个东西,但是在 UILabel 上需要自定义. 鉴于有的朋友很少接触 UIMenuController,这里先介绍一些基本知识. UIMenuController 可以使用系统自带的方法,也可以自定义. 系统默认支持UITextField.UITextView.UIWebView控件的UIMenu

  • iOS长按UIlabel实现可复制功能

    前言 相信大家都知道在iOS中有三个控件自身是支持拷贝,粘贴的,如:UITextField,UITextView,UIWebView.但是,有时候我们会遇到需要长按UIlabel,弹出"复制"item,来实现可复制.那该怎么办呢?下面就来一起看看吧. 首先UIKit中提供给我们几个类 在开始之前,我们需要自定义一个WINCopyLabel继承UILable - (instancetype)initWithFrame:(CGRect)frame { if (self = [super i

  • IOS 长链接与短链接之间的转换

    IOS 长链接与短链接之间的转换 首先需要将字符串使用md5加密,添加NSString的md5的类别方法如下 .h文件 #import <CommonCrypto/CommonDigest.h> @interface NSString (md5) -(NSString *) md5HexDigest; @end .m文件 #import "NSString+md5.h" @implementation NSString (md5) - (NSString *) md5Hex

  • IOS 开发之UILabel 或者 UIButton加下划线链接

    IOS 开发之UILabel 或者 UIButton加下划线链接          本文主要介绍了IOS中 UILable及UIButton的带下划线链接的实现方法及附有源码下载,大家开发IOS 应用有需要的可以参考下: 方法一: NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"查看所有中奖记录"]; NSRange strRange = {0,[str lengt

  • html5+CSS 实现禁止IOS长按复制粘贴功能

    因为在移动端APP需要实现长按执行别的事件,但是在iOS系统有默认的长按选择复制粘贴,禁止此功能在网上找了很多资料,最终整理出目前最好的解决方法. 项目是APP,已经经过多款手机适配此时,因此可以放心使用. /*设置IOS页面长按不可复制粘贴,但是IOS上出现input.textarea不能输入,因此将使用-webkit-user-select:auto;*/ *{ -webkit-touch-callout:none; /*系统默认菜单被禁用*/ -webkit-user-select:non

  • 微信小程序实现文字长按复制与一键复制功能全过程

    目录 一.不引入外部组件的实现方式 二.引入外部组件的实现方式 总结 一.不引入外部组件的实现方式 <!-- index.wxml --> <view> <!-- 长按复制 --> <view bindlongtap="copyText" data-key="{{item.cdkey}}">{{ item.cdkey }}</view> <text bindlongtap="copyText

  • iOS App中UILabel的自定义及在Auto Layout中的使用

    自定义UILabel,接受触摸事件: 复制代码 代码如下: #import <UIKit/UIKit.h>   @interface myLabel : UILabel   @end 复制代码 代码如下: #import "myLabel.h" @implementation myLabel - (id)initWithFrame:(CGRect)frame {     self = [super initWithFrame:frame];     if (self) {

  • iOS动态调整UILabel高度的几种方法

    简介 UILabel类实现了一个只读文本视图.您可以使用这个类来画一个或多个行静态文本,比如你可能使用确定的其他部分的用户界面.UILabel类支持既简单又复杂的样式标签的文本,还可以控制外观,比如标签是否使用一个影子或吸引了一大亮点. 在iOS程序中,看的见.摸得着的,都是UIView的子类.UILabel是一个用于显示文字信息的标签视图类,即UIView的子类. 以下是关于UILabel的官方网址:https://developer.apple.com/reference/uikit/uil

  • iOS应用中UILabel文字显示效果的常用设置总结

    创建UIlabel对象 复制代码 代码如下: UILabel* label = [[UILabel alloc] initWithFrame:self.view.bounds]; 设置显示文本 复制代码 代码如下: label.text = @"This is a UILabel Demo,"; 设置文本字体 复制代码 代码如下: label.font = [UIFont fontWithName:@"Arial" size:35]; 设置文本颜色 复制代码 代码如

  • iOS开发笔记--详解UILabel的相关属性设置

    在iOS编程中UILabel是一个常用的控件,下面分享一下UILabel的相关属性设置的方法. 很多学习iOS6编程都是从storyboard开始,用到UILabel时是将控件拖到storyboard中生成实现,如果想要在-(void)viewDidLoad中用代码如[_label initWithFrame:CGRectMake(X,Y,WIDTH,HEIGHT)]方法改变拖拽到storyboard的label的大小是行不通的,因为程序加载时先执行了-(void)viewDidLoad的代码,

  • Android中的脑残设计总结

    Trackball轨迹球 这有点类似于PC上面的鼠标,可以用于导航,为此便有了Focus,但是这实际操作意义并不大,因为整个屏幕都是触控的,还用导航干什么,先把Focus用Trackball移动到某个控件再去点击这不是多此一举吗?而且这个Focus十分难以控制,给开发者添加了无尽的烦恼,所以轨迹球是脑残的设计,所以现在Android的设备已经进化的都去掉了轨迹球了.当初为何加入这个东西呢?我猜因为Android的原始设计是一直带有键盘的,或者是为了非触控屏幕准备的,如果有非触控,用一个类似鼠标的

随机推荐