对UILabel添加UIMenuController扩展
时间:2022-05-30
本文章向大家介绍对UILabel添加UIMenuController扩展,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、UIMenuController认识
1、默认情况下,UITextView / UITextFiled / UIWebView 都有苹果自带的有UIMenuController功能
二、对UILabel添加UIMenuController扩展
2、新建一个SSCopyLabel,继承UIlabel,.m文件如下:
#import "SSCopyLabel.h"
@implementation SSCopyLabel
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
self.userInteractionEnabled = YES;
UILongPressGestureRecognizer *touch = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self addGestureRecognizer:touch];
}
return self;
}
-(void)handleTap:(UIGestureRecognizer*) recognizer {
[self becomeFirstResponder];
// 1.获得菜单 menu
UIMenuController *menu = [UIMenuController sharedMenuController];
// 2.设置菜单最终显示的位置
[menu setTargetRect:self.frame inView:self.superview];
UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"粘贴" action:@selector(pasteAction)];
menu.menuItems = [NSArray arrayWithObjects:menuItem, nil];
// 当label有内容的时候,再添加一个UIMenuItem
if (self.text.length > 0) {
UIMenuItem *menuItem1 = [[UIMenuItem alloc] initWithTitle:@"拷贝" action:@selector(copyAction)];
menu.menuItems = [NSArray arrayWithObjects:menuItem, menuItem1, nil];
}
// 让UIMenuController显示出来,第二个参数不能直接写YES,否则会导致UIMenuController不断地闪烁
[menu setMenuVisible:YES animated:!menu.isMenuVisible];
}
- (void)pasteAction{
UIPasteboard *pBoard = [UIPasteboard generalPasteboard];
if (pBoard.string != nil) {
self.text = pBoard.string;
}
}
- (void)copyAction{
UIPasteboard *pBoard = [UIPasteboard generalPasteboard];
pBoard.string = self.text;
}
- (BOOL)canBecomeFirstResponder{
return YES;
}
demo示例: 没内容的时候:
有内容的时候:
- PHP数据结构(二十四) ——堆排序
- PHP数据结构(二十五) ——并归排序
- PHP数据结构(二十六) ——基数排序实现36进制数排序
- Apache配置
- jquery事件
- 设计模式专题(二)——策略模式
- ASP.NET AJAX(10)__Authentication ServiceAuthentication ServiceAuthentication Service属性Authentication
- 高效开发 MVVM 和 databinding 你需要使用的工具
- ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预
- 设计模式专题(三)——装饰模式
- ASP.NET AJAX(8)__Microsoft AJAX Library中异步通信层的使用什么是异步通信层Micorsoft AJAX Library异步通信层的组成WebRequestExec
- ASP.NET AJAX(7)_Microsoft AJAX Library扩展客户端组件继承时需要注意的问题扩展类型如何修改已有类型
- ASP.NET AJAX(6)__Microsoft AJAX Library中的面向对象类型系统命名空间类类——构造函数类——定义方法类——定义属性类——注册类类——抽象类类——继承类——调用父类方
- 设计模式专题(四)——代理模式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux 编写Shell脚本
- Linux文件权限与归属、文件的特殊权限、文件的隐藏属性
- Linux文件访问控制列表、su命令与sudo服务
- GPS之 NMEA-0183协议
- Zeppelin 安装与初体验
- Hive 安装与配置
- 如何将SAP Cloud for Customer的扩展字段放置到Embedded Component中
- pthread的使用
- shell程序设计
- SAP CDS view权限控制实现原理介绍
- shell程序设计的流程控制
- SAP CRM数据库表CRMD_SRV_REFOBJ和CRMD_SRV_OSSET
- 堆和栈的区别
- 用ABAP模拟JavaScript的柯里化语言特性(Curry)
- 使用ABAP并发编程解决一个实际应用场景中的性能瓶颈问题