九、点击控件弹出复制粘贴剪切选择等(UIMenuController)

默认情况下,有以下控件已经支持UIMenuController

   UITextField

   UITextView

   UIWedView

以UITable为例,说明点击后弹出复制剪切粘贴等为例  

使用的整体思路:(系统自带的文字)

1、新建一个UILabel的类,如果想以后storyboard和Xib都可以用,就可以调用awakeFromNib和initWithFrame方法,同时进行初始化操作

2、使UILabel成为第一响应者作用:

    提供两种方法canBecomeFirstResponder和canPerformAction(两种必写)

同时告诉UIMenuController支持哪些操作,这些操作如何处理。

3、创建UIMenuController对象,设置两个条件

首先:设置弹出的对象显示的范围

然后:让对象能够显现出来,且动画方式出现

4、UIMenuController对象的各类方法操作的实现(copy,paste,cut等)

 1 #import "ZWLabel.h"
 2
 3 @implementation ZWLabel
 4
 5 - (void)awakeFromNib
 6 {
 7     [self setup];
 8 }
 9 - (instancetype)initWithFrame:(CGRect)frame
10 {
11     if (self = [super initWithFrame:frame]) {
12         [self setup];
13     }
14     return self;
15 }
16 /**
17  *  初始化操作
18  */
19 - (void)setup
20 {
21     self.userInteractionEnabled = YES;
22     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)];
23     [self addGestureRecognizer:tap];
24 }
25 /**
26  *  点击后操作
27  */
28 - (void)labelClick
29 {
30     //使之成为第一响应者,成为之后会提供两种方法becomeFirstResponder和canPerformAction
31     //同时告诉UIMenuController支持哪些操作,这些操作如何处理
32     [self becomeFirstResponder];
33
34     //创建menu控制器
35     UIMenuController *menu = [UIMenuController sharedMenuController];
36     //弹出的menu显示在哪个区域(两种方式)
37     //    [menu setTargetRect:self.frame inView:self.superview];
38     [menu setTargetRect:self.bounds inView:self];
39     //使menu可见
40     [menu setMenuVisible:YES animated:YES];
41 }
42
43 /**
44  *  是label能成为第一响应者
45  */
46 - (BOOL)canBecomeFirstResponder
47 {
48     return YES;
49 }
50
51 /**
52  *  label能执行哪些操作(比如copy,paste)
53  */
54 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender
55 {
56     NSLog(@"%@",NSStringFromSelector(action));//此处可以打印出支持哪些操作(比如copy,cut,paste等,详情见最底部的打印结果)
57     if (action == @selector(copy:) || action == @selector(cut:) || action == @selector(paste:)) return YES;
58     return NO;
59 }
60
61 - (void)copy:(UIMenuController *)menu
62 {
63     //将自己的文字复制到粘贴板
64     UIPasteboard *board = [UIPasteboard generalPasteboard];
65     board.string = self.text;
66 }
67 - (void)cut:(UIMenuController *)menu
68 {
69     //将自己的文字复制到粘贴板
70     [self copy:menu];
71     //清空文字
72     self.text = nil;
73 }
74 - (void)paste:(UIMenuController *)menu
75 {
76     UIPasteboard *board = [UIPasteboard generalPasteboard];
77     self.text = board.string;
78 }

使用自定义文字

整体都需要移动到viewController中,否则虽然都在UILabel中,能正确运行,但是会提示一堆警告。

即不用重新新建一个继承自UILabel的类,只需要添加了一个UIMenuItem对象,去除掉canPerformAction以及相关的方法即可,代码如下:

注意:需要在label中勾上userInteractionEnabled

 1 #import "ViewController.h"
 2 @interface ViewController ()
 3 @property (weak, nonatomic) IBOutlet UILabel *textLabel;
 4
 5 @end
 6
 7 @implementation ViewController
 8
 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)];
12     [self.textLabel addGestureRecognizer:tap];
13 }
14
15 /**
16  *  点击后操作
17  */
18 - (void)labelClick
19 {
20     //使之成为第一响应者,成为之后会提供两种方法becomeFirstResponder和canPerformAction
21     //同时告诉UIMenuController支持哪些操作,这些操作如何处理
22     [self.textLabel becomeFirstResponder];
23
24     //创建menu控制器
25     UIMenuController *menu = [UIMenuController sharedMenuController];
26
27     //弹出的menu显示在哪个区域
28     //    [menu setTargetRect:self.frame inView:self.superview];
29     [menu setTargetRect:self.textLabel.bounds inView:self.textLabel];
30     //使menu可见
31     [menu setMenuVisible:YES animated:YES];
32
33     //自定义menuItem
34     UIMenuItem *ding = [[UIMenuItem alloc] initWithTitle:@"顶" action:@selector(ding:)];
35     UIMenuItem *replay = [[UIMenuItem alloc] initWithTitle:@"回复" action:@selector(replay:)];
36     UIMenuItem *report = [[UIMenuItem alloc] initWithTitle:@"举报" action:@selector(report:)];
37     menu.menuItems = @[ding,replay,report];
38 }
39
40 - (void)ding:(UIMenuController *)menu
41 {
42     NSLog(@"%s  %@",__func__,menu);
43 }
44 - (void)replay:(UIMenuController *)menu
45 {
46     NSLog(@"%s  %@",__func__,menu);
47 }
48 - (void)report:(UIMenuController *)menu
49 {
50     NSLog(@"%s  %@",__func__,menu);
51 }
52 - (BOOL)canBecomeFirstResponder
53 {
54     return YES;
55 }

支持的系统自带的各类方法:

 1 2016-07-13 22:34:35.099 UIMenuController[16825:1745455] cut:
 2 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] copy:
 3 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] select:
 4 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] selectAll:
 5 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] paste:
 6 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] delete:
 7 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] _promptForReplace:
 8 2016-07-13 22:34:35.100 UIMenuController[16825:1745455] _transliterateChinese:
 9 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _showTextStyleOptions:
10 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _define:
11 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _addShortcut:
12 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _accessibilitySpeak:
13 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _accessibilitySpeakLanguageSelection:
14 2016-07-13 22:34:35.101 UIMenuController[16825:1745455] _accessibilityPauseSpeaking:
15 2016-07-13 22:34:35.102 UIMenuController[16825:1745455] _share:
16 2016-07-13 22:34:35.102 UIMenuController[16825:1745455] makeTextWritingDirectionRightToLeft:
17 2016-07-13 22:34:35.102 UIMenuController[16825:1745455] makeTextWritingDirectionLeftToRight:
时间: 2024-08-24 17:25:43

九、点击控件弹出复制粘贴剪切选择等(UIMenuController)的相关文章

根据条件决定My97DatePicker日期控件弹出的日期格式

代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>根据条件决定My97DatePicker日期控件弹出的日期格式</title> 6 <link rel="stylesheet" type="text/css" href="css/bootstrap.min.

原生js日期时间插件鼠标点击文本框弹出日期时间表格选择日期时间

原文出处 (这是我从互联网上搜来的,感觉能满足各方面的需求.个人感觉挺不错的,所以后期修改了一下向大家推荐!) 效果图: html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org

DetailsView控件弹出删除确认对话框

方法一:添加事件代码 protected void DetailsView1_ItemCreated(object sender, EventArgs e) { int cc = DetailsView1.Controls[0].Controls.Count; LinkButton lb=(LinkButton)DetailsView1.Controls[0].Controls[cc-2].Controls[0].Controls[0]; lb.Attributes.Add("onclick&q

my97日期控件弹出位置显示异常

使用my97日期选择控件的时候,如果整个页面是有滚动条的,根据触发显示日期的控件的父控件的position不同会显示不同的情况 1.position不为fixed则滑动滚动条,显示的日期层不会出现异常位移,如下图 滚动条不动,正常显示 滚动条没去,正常显示 2.position为fixed则滑动滚动税票,显示的日期层会根据滚动条的移动而移动,如下图 滚动条不动,正常显示 滚动条滑动,异常位移 对于第二种情况解决方法如下: 写一个方法 如下: function showDate() { $('if

android :点击某个按钮弹出在原有布局中没有(或者存在)内容 :以删除原有布局内容为例

主要涉及了(1)对布局中某个控件的监听 (2)在布局文件中设置可显示,删除的参数 visibility的参数的有三个,在这里我只设置了一个,可见的. android:visibility="visible" 剩下的和他的用法相同. (3)在代码中监听控件后,对visibility的参数重新设置. 效果图:点击按钮后edittext不见了 (1)点击高级按钮前 (2)点击高级按钮后 (1)布局文件 <?xml version="1.0" encoding=&qu

iOS开发项目篇—14点击标题按钮弹出菜单

iOS开发项目篇—14点击标题按钮弹出菜单 一.简单说明 (1)简单实现 点击标题按钮弹框,在箭头向上的时候,显示标题菜单 把ImageView添加到谁的身上?三角形的箭头在导航栏上,因此不能添加到tableview上. 分析图示: 有两个两种方法可以考虑: (1)添加到导航控制器上,因为导航栏是在导航控制器上的. (2)不用考虑控制器,直接添加到窗口上. 拿到窗口 (1)self.view.window这个属性谨慎使用,当开始加载的时候,为空 (2)获取主窗口  [UIApplication

Android点击列表后弹出输入框,所点击项自动滚动到输入框上方(类似微信的评论)

Android点击列表后弹出输入框,所点击项自动滚动到输入框上方 使用微信的朋友圈会发现,点击某一条评论后输入框会弹出来,然后所点击的那一项会自动地滚动到输入框上方的位置,这样如果开始所点击的评论在屏幕很下方的话,就不会被输入框遮住,虽然微信这一点在我的MX2频繁点几次后滚动的位置就完全错误了,但据说在有些机型上效果还不错,还有其他地方可能会有类似的需求,比如登录时软键盘可能会把登录按钮遮住. 要实现这个功能需要注意的地方主要有两点: 什么时候进行滚动操作,以及有可能还需要在输入框消失时回滚回去

手机调用系统的拍照和裁剪功能,如果界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。

code如下: //Longest common sequence, dynamic programming method void FindLCS(char *str1, char *str2) { if(str1 == NULL || str2 == NULL) return; int length1 = strlen(str1)+1; int length2 = strlen(str2)+1; int **csLength,**direction;//two arrays to recor

点击文本框弹出可供选择的checkbox复选框代码实例

点击文本框弹出可供选择的checkbox复选框代码实例:本章节分享一段代码实例,它能够点击文本框的时候,能够弹出下拉的checkbox复选框,选中复选框就能够将值写入文本框中,可能在实际应用中的效果没有这么直白简单,不过可以作为一个例子演示,以便于学习者理解和扩展.代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author&qu