在我们日常的开发中经常会遇到一些小需求,比如需要长按控件来拷贝控件中得内容.我们知道在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时,系统会调用上面对应的方法

F101CDB2-A373-40E5-ACF3-48C6B05EACB4.png

二、.以下是剪贴板中可以放置的内容(除了字符串,也可以拷贝图片,URL等)
1.UIPasteboardTypeListString 字符串数组, 包含kUTTypeUTF8PlainText
2.UIPasteboardTypeListURL URL数组,包含kUTTypeURL
3.UIPasteboardTypeListImage 图形数组, 包含kUTTypePNG 和kUTTypeJPEG
4.UIPasteboardTypeListColor 颜色数组

简单实现UIlabel可复制功能的更多相关文章

  1. ios label 简单的长按复制文本信息

    在iOS开发过程中,有时候会用到UILabel展示的内容,那么就设计到点击UILabel复制它上面展示的内容的功能,也就是Label长按复制功能.网上有很多种给Label添加长按复制功能的方法,这里我 ...

  2. 步步入佳境---UI入门(4) --简单练习

    一,创建SingleViewApplication 1,UILabel的简单使用 UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(0, ...

  3. UILabel文本垂直顶部对齐的方法

    也不知道为什么UILabel本身没有提供文本垂直顶部对齐的方法,真的有点晕.我们创建一个简单的UILabel来看看: [box type="info"] UILabel *myLa ...

  4. ZeroClipboard插件:兼容各浏览器网页复制功能

    常规利用JS编写的网页复制功能只对IE有效,无法做到兼容其它浏览器,代码如下: function copyToClipBoard(){ var clipBoardContent="" ...

  5. Copy_on_write的简单实现

    Copy_on_write即写时复制,它的原理是通过引用计数来实现的. 即在分配空间时多分配额外的空间,用来记录有多少个指针指向该空间.当有新的指针指向该空间,引用计数则加一,当要释放该空间时,引用计 ...

  6. swift动画小试牛刀

    swift刚出没多长时间,看到各种惊呼党,翻译党,黑苹果党,视频教学党如雨后春笋版喷薄而出......我想说有点开发基础的人,其实看看文档也就行了,毕竟语言是拿来用的. 今天花了一下午的时间,没有太看 ...

  7. 【译】使用UIKit进行面向对象的编程

    在WWDC 2015上,Apple谈了Swift中面向协议编程的话题,令人深思.在那之后,好像每个人都在讨论关于协议扩展的话题,这个新的语言特性使每个人都有所困惑. 我阅读了许多关于Swift中协议的 ...

  8. 从零开始学iPhone开发(2)——控件的使用

    这一节我们开始学习iOS中简单控件的使用. 在iOS编程中,简单的控件有很多,其中主要的用的多的有: UILabel,UIButton,UISegmentedControl, UITextField, ...

  9. Swift: 打造滑动解锁文字动画

    原文:Swift: 打造滑动解锁文字动画 最近木事,找出来玩了玩facebook的paper.到处都是那个"slide to unlock your phone"的效果啊.忽闪忽闪 ...

随机推荐

  1. Cannot read property 'tap' of undefined

    E:\vue-project\vue-element-admin-master>npm run build:prod vue-element-admin@3.8.1 build:prod E:\ ...

  2. 1207: [HNOI2004]打鼹鼠

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4154  Solved: 1997[Submit][Status][Discuss] Descript ...

  3. elasticsearch 大量数据翻页到后面无数据解决

    默认情况下报错信息:from + size 不能大于10000 {"error":{"root_cause":[{"type":" ...

  4. ZendFramework-2.4 源代码 - 关于MVC - View层 - 控制器返回值

    <?php class ReturnController extends AbstractActionController { public function returnAction() { ...

  5. keil swd设置下载stm32f103c8t6.

    1.debug选项,选择jlink,2.utilities选择jlink3.加载flash算法.4.选择swd模式,其他基本上默认,这样就可以下载了对rom和ram设置需要说明一下:1,IROM1,前 ...

  6. tomcat8+idea远程调试

    window下 setenv.bat增加 set JPDA_OPTS=-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n lin ...

  7. Git-起步

    Git命令行 只要输入git,Git就会不带任何参数地列出它的选项和最常用的子命令. 要得到一个完整的git子命令列表,可以输入git help --all 显示版本号 git --version 每 ...

  8. c++实验4

    1. 车辆基本信息管理  #include <iostream> using namespace std; #include <string> #include "c ...

  9. 【Keepalived+MySQL】MySQL双主互备+高可用

    一.基本信息说明 [DB1] IP: 192.168.102.144 hostname: LVS-Real1 [DB2] IP: 192.168.102.145 hostname: LVS-Real2 ...

  10. Python 包导入

    首先我们先了解下python中寻找模块的顺序 是否是内建模块 ->主目录 ->PYTHONPATH环境变量 ->标准库 -> 首先判断这个model是否是built-in,即内 ...