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的更多相关文章

  1. R语言简单实现聚类分析计算与分析(基于系统聚类法)

    聚类分析计算与分析(基于系统聚类法) 下面以一个具体的例子来实现实证分析.2008年我国其中31个省.市和自治区的农村居民家庭平均每人全年消费性支出. 根据原始数据对我国省份进行归类统计. 原始数据如 ...

  2. 最简单的基于DirectShow的示例:视频播放器自定义版

    ===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...

  3. 基于jQuery自适应宽度跟高度可自定义焦点图

    基于jQuery自适应宽度跟高度可自定义焦点图.这是一款带左右箭头,缩略小图切换的jQuery相册代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <section cl ...

  4. 【咸鱼教程】基于系统时间的计时器DateTimer(不受FPS影响)

    教程目录一 计时器简介二 计时器实现三 Demo下载 一 计时器简介在手机上跑游戏时,可能由于运动物体过多,导致帧频太低,计时不准确.比如一些倒计时的游戏,可能倒计时30s,变成了35s.比如ipho ...

  5. 基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table

    基于VueJS的render渲染函数结合自定义组件打造一款非常强大的IView 的Table https://segmentfault.com/a/1190000015970367

  6. 笨重的mfc还在基于系统控件,熟练的mfc工程师还比不过学习Qt一个月的学生开发效率高(比较精彩,韦易笑)

    作者:韦易笑链接:https://www.zhihu.com/question/29636221/answer/45102191来源:知乎著作权归作者所有,转载请联系作者获得授权. 更新:擦,本来只有 ...

  7. ubuntu 使用 vsftpd 基于系统用户配置相互隔离的 ftp (ftps) 服务

    我们在日常使用 UbuntuServer 服务器时,经常会直接使用基于 ssh 的  sftp 连接服务器直接进行文件上传和下载,不过这个方式其实有一定的安全隐患,当一个团队有多个人员,需要连接服务器 ...

  8. 基于Bootstrap里面的Button dropdown打造自定义select

    最近工作非常的忙,在对一个系统进行改版.项目后台是MVC1.0开发的,但是前端部分已经改过几个版本,而已之前的设计师很强大,又做设计又做前端开发.而已很时尚和前沿,使用了一直都很热门的Bootstra ...

  9. Android系统在新进程中启动自定义服务过程(startService)的原理分析

    在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...

随机推荐

  1. URL是什么?

    URL是统一资源定位符,有时也被俗称为网页地址. 如同在网络上的门牌,是因特网上标准的资源的地址(Address). 在因特网的历史上,统一资源定位符的发明是一个非常基础的步骤.统一资源定位符的语法是 ...

  2. TP的一条sql语句(子查询)

    $model=M(''); $model->table(C('DB_PREFIX').'goods as g') ->join(C('DB_PREFIX').'orders as o on ...

  3. 一步步学Mybatis-以接口操作的方式编程(2)

    上一章节中,我们已经搭建玩了最简单的能够运行的HelloWorld环境,这一章将把上章中的操作方式改为以接口的方式操作 我们可以发现在上一个章节中 public static void testBas ...

  4. Android 使用 TableLayout 布局拉伸宽度

    转自:http://www.cnblogs.com/ghj1976/archive/2011/04/21/2023850.html 布局文件 <?xml version="1.0&qu ...

  5. 浏览器使用ActiveX控件

    在IE中使用ActiveX控件,需要使用HTML中的标志是<OBJECT>,该标记几个重要的参数特性有:1.ID:为控件提供一个标识名称,为HTML代码提供一种访问该控件的入口.2.CLA ...

  6. Web service是什么?(转)

    我认为,下一代互联网软件将建立在Web service(也就是"云")的基础上. 我把学习笔记和学习心得,放到网志上,欢迎指正. 今天先写一个最基本的问题,Web service到 ...

  7. 在Ubuntu 14.04 64bit上安装numpy和matplotlib库

    原文:http://blog.csdn.net/tao_627/article/details/44004541 按照这个成功安装! 机器学习是数据挖掘的一种实现形式,在学习<机器学习实战> ...

  8. 安装apache2.4.10

    一:依赖安装:apache依赖于apr,apr-util,pcre,所以需要先安装他,并且需要最新的 apr官网:http://apr.apache.org/download.cgi pcre官网:h ...

  9. Thrift CentOS安装和使用

    Thrift是Apache的一个开源的跨语言服务开发框架,它提供了一个代码生成引擎来构建服务,支持C++,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C#,Coc ...

  10. 关于设置ScrollView的滚动条为隐藏的方法

    要实现ScrollView滚动条的隐藏,有两种方法, 一种是在XML的ScrollView布局中加入属性android:scrollbars="none" 另一种则是在代码中获取S ...