基于系统的UIMenuController的使用及自定义UIMenuItem
1、前言
- 在开发中 UIMenuController 用得较少,偶尔遇到了,一时竟想不起来,因此做个回顾
2、系统默认支持 UIMenuController 的UI控件
UITextField
UITextView
UIWebView
...
3、让 UILabel 拥有系统的 UIMenuController
- 自定义 UILabel 内部
// 1、让自定义的 UILabel 有资格成为第一响应者
- (BOOL)canBecomeFirstResponder {
return YES;
}
// 2、自定义的 UILabel 的 Menu 能执行哪些操作
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
// cut:剪切 / copy:复制 / paste:粘贴
if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:)) {
return YES;
}
return NO;
}
// 3、那这些方法怎么实现呢
- (void)cut:(UIMenuController *)menu {
// 先将自己的文字复制到粘贴板
[self copy:menu];
// 在清空文字
self.text = nil;
}
- (void)copy:(UIMenuController *)menu {
// 将自己的文字复制到粘贴板
UIPasteboard *board = [UIPasteboard generalPasteboard];
board.string = self.text;
}
- (void)paste:(UIMenuController *)menu {
// 将粘贴板的文字复制到自己身上
UIPasteboard *board = [UIPasteboard generalPasteboard];
self.text = board.string;
}
// 4、系统的 menuController 方法还有 selector: / selectAll: /delete: 等
- 外部控制器里, 给 label 添加点击手势,在手势方法里
- (void)labelClick {
// 让 自定义的label 成为第一响应者
[self.label becomeFirstResponder];
// 创建 UIMenuController
UIMenuController *menu = [UIMenuController sharedMenuController];
// 设置 UIMenuController 的显示区域,targetRect 为指向的矩形框,inView 为以该 view 的左上角为原点
[menu setTargetRect:self.view.bounds inView:self.view];
// 设置可见
[menu setMenuVisible:YES animated:YES];
}
4、让 UILabel 拥有自定义的 UIMenuController
- 自定义 UILabel 内部
// 1、让自定义的 UILabel 有资格成为第一响应者
- (BOOL)canBecomeFirstResponder {
return YES;
}
// 2、自定义的 UILabel 的 Menu 能执行哪些操作 , 自定义返回 NO
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
return NO;
}
外部控制器里, 给 label 添加点击手势,在手势方法里
- 自定义的 UIMenuItem 及 UIMenuItem 对应的方法写在外部(控制器)里
- (void)labelClick {
UIMenuController *menu = [UIMenuController sharedMenuController];
// 先处理之前的
if (menu.menuVisible) {
[menu setMenuVisible:NO animated:YES];
} else {
[self.label becomeFirstResponder];
// 创建自定义的 UIMenuItem
UIMenuItem *item1 = [[UIMenuItem alloc]initWithTitle:@"zhang1" action:@selector(item1Click)];
UIMenuItem *item2 = [[UIMenuItem alloc]initWithTitle:@"zhang2" action:@selector(item2Click)];
// 设置 MenuItem
[menu setMenuItems:@[item1, item2]];
[menu setTargetRect:self.view.bounds inView:self.view];
[menu setMenuVisible:YES animated:YES];
}
}
// 实现 UIMenuItem 对应的方法
- (void)item1Click {
}
- (void)item2Click {
}
- 自定义了 UIMenuItem 后,若其他地方用 UIMenuController,不用这些item ,需要把 menuItems = nil 或 @[ ]
5、让 UITableCell 点击拥有自定义的 UIMenuController
- 自定义 cell 内部
// 1、让自定义的 cell 有资格成为第一响应者
- (BOOL)canBecomeFirstResponder {
return YES;
}
// 2、自定义的 cell 的 Menu 能执行哪些操作, 自定义返回 NO
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
return NO;
}
- 在外部(控制器里),在 cell 点击方法里
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIMenuController *menu = [UIMenuController sharedMenuController];
// 先处理之前的
if (menu.menuVisible) {
[menu setMenuVisible:NO animated:YES];
} else {
DIYCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[cell becomeFirstResponder];
UIMenuItem *item1 = [[UIMenuItem alloc]initWithTitle:@"zhang1" action:@selector(item1Click)];
UIMenuItem *item2 = [[UIMenuItem alloc]initWithTitle:@"zhang2" action:@selector(item2Click)];
[menu setMenuItems:@[item1, item2]];
// 设置 menu 的指向的矩形框
CGRect rect = CGRectMake(0, cell.diy_height * 0.5, cell.diy_width, cell.diy_height * 0.5);
[menu setTargetRect:rect inView:cell];
[menu setMenuVisible:YES animated:YES];
}
}
基于系统的UIMenuController的使用及自定义UIMenuItem的更多相关文章
- R语言简单实现聚类分析计算与分析(基于系统聚类法)
聚类分析计算与分析(基于系统聚类法) 下面以一个具体的例子来实现实证分析.2008年我国其中31个省.市和自治区的农村居民家庭平均每人全年消费性支出. 根据原始数据对我国省份进行归类统计. 原始数据如 ...
- 最简单的基于DirectShow的示例:视频播放器自定义版
===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...
- 基于jQuery自适应宽度跟高度可自定义焦点图
基于jQuery自适应宽度跟高度可自定义焦点图.这是一款带左右箭头,缩略小图切换的jQuery相册代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <section cl ...
- 【咸鱼教程】基于系统时间的计时器DateTimer(不受FPS影响)
教程目录一 计时器简介二 计时器实现三 Demo下载 一 计时器简介在手机上跑游戏时,可能由于运动物体过多,导致帧频太低,计时不准确.比如一些倒计时的游戏,可能倒计时30s,变成了35s.比如ipho ...
- 基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table
基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table https://segmentfault.com/a/1190000015970367
- 笨重的mfc还在基于系统控件,熟练的mfc工程师还比不过学习Qt一个月的学生开发效率高(比较精彩,韦易笑)
作者:韦易笑链接:https://www.zhihu.com/question/29636221/answer/45102191来源:知乎著作权归作者所有,转载请联系作者获得授权. 更新:擦,本来只有 ...
- ubuntu 使用 vsftpd 基于系统用户配置相互隔离的 ftp (ftps) 服务
我们在日常使用 UbuntuServer 服务器时,经常会直接使用基于 ssh 的 sftp 连接服务器直接进行文件上传和下载,不过这个方式其实有一定的安全隐患,当一个团队有多个人员,需要连接服务器 ...
- 基于Bootstrap里面的Button dropdown打造自定义select
最近工作非常的忙,在对一个系统进行改版.项目后台是MVC1.0开发的,但是前端部分已经改过几个版本,而已之前的设计师很强大,又做设计又做前端开发.而已很时尚和前沿,使用了一直都很热门的Bootstra ...
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...
随机推荐
- Codeforces Round #336 (Div. 2) D. Zuma 记忆化搜索
D. Zuma 题目连接: http://www.codeforces.com/contest/608/problem/D Description Genos recently installed t ...
- Android 数据库打包随APK发布
有些时候我们的软件用到SQLite数据库,这个时候怎么把一个做好的数据库打包进我们的APK呢,其实很简单,就是把我们的数据库文件放到我们的手机里,所以不必局限在哪个地方写这个代码,在第一次创建数据库的 ...
- 【JavaScript】JS的启动机制
DOM Event------------------>触发function() function 自身的调用 主要就是调用function 1.DOM Event 2.调用function
- [Angular2 Form] Display Validation and Error Messaging in Angular 2
Angular 2’s ngModel provides error objects for each of the built-in input validators. You can access ...
- 利用URLScan工具过滤URL中的特殊字符(仅针对IIS6)
客户公司搞安全检查,扫描出来我们之前做的系统有一个高危漏洞:IIS tilde directory enumeration,也就是利用“~”字符猜解暴露短文件/文件夹名,比如,采用这种方式构造URL: ...
- ASCII码对应表
chr(9) tab空格 chr(10) 换行 chr(13) 回车 Chr(13)&chr(10) 回车换行 chr(32) 空格符 ...
- 文件写入文件分布式系统(asp.net C#)
) { try { System.Drawing.Image img = System.Drawing.Image.FromStream(fileData.InputStream); &&am ...
- ubuntu14 部署zookeeper3.4.6启动失败
解压缩zookeeper,启动时,报如下错误: zkServer.sh: 81: /home/xxx/zookeeper-3.4.6/bin/zkEnv.sh: Syntax error: " ...
- js本地图片预览代码兼容所有浏览器
html代码 <div id="divPreview" style="width: 160px; height: 170px"><img id ...
- BootStrap2学习日记21---消息提示
<p><a href="#" title="中国(China),位于东亚,是一个以华夏文明为主体.中华文化为基础,以汉族为主要民族的统一多民族国家,通用 ...