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. [Angular2 Router] Style the Active Angular 2 Navigation Element with routerLinkActive

    You can easily show the user which route they are on using Angular 2’s routerLinkActive. Whenever a ...

  2. 摘录知乎上关于android开发的话题精华

    1.初学者学习 Android 开发,有什么好网站推荐? http://www.zhihu.com/question/19611325 2.Android 开发有哪些新技术出现? http://www ...

  3. jquery.validate+jquery.form提交的三种方式

    原文:http://www.cnblogs.com/datoubaba/archive/2012/06/06/2538873.html jquery.validate+jquery.form提交的三种 ...

  4. mvc3.0 +linq 操作数据库中表的数据(ps:本人菜鸟刚学)

    1:添加控制器类文件HomeController.cs其代码如下: using System; using System.Collections.Generic; using System.Linq; ...

  5. cocosbuilder中使用字体描边时,字符重叠,间距过小问题

    cocosbuilder中使用字体描边时,字符重叠,间距过小问题 cocos2d-x 3.7 v3.7解析cocosbuilder中描边字体的代码如下: void LabelTTFLoader::pa ...

  6. 【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』

    作者:阿里云用户mr_wid ,z)NKt#   @I6A9do   如果感觉该评测对您有所帮助, 欢迎投票给本文: UO<claV   RsfTUb)<   投票标题:  28.[阿里云 ...

  7. java正则表达式常用实例——借鉴思路

    转载自:http://mp.weixin.qq.com/s?__biz=MjM5OTM4NDMyMg==&mid=2650044497&idx=1&sn=dc80fa35f7e ...

  8. NSOperation与GCD之间的关系

    NSOperation与GCD的相同之处 1.NSOperation和NSOperationQueue实现多线程的步骤: 先将需要执行的操作封装到一个NSOperation对象中. 然后将NSOper ...

  9. 《MFC游戏开发》笔记五 定时器和简单动画

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9332377 作者:七十一雾央 新浪微博:http:// ...

  10. 将Winform程序快速转换为在浏览器中运行的程序

    http://www.codeproject.com/Articles/31429/Embedding-a-NET-WinForms-Application-in-an-Interne 详见以上文章. ...