分类: ios开发2012-08-06 17:15 11961人阅读 评论(0) 收藏 举报

1. Menu所处的View必须实现 – (BOOL)canBecomeFirstResponder, 且返回YES

2. Menu所处的View必须实现 – (BOOL)canPerformAction:withSender, 并根据需求返回YES或NO

3. 使Menu所处的View成为First Responder (becomeFirstResponder)

4. 定位Menu (- setTargetRect:inView:)

5. 展示Menu (- setMenuVisible:animated:)

  1. @implementation UICopyLabel
  2. // default is NO
  3. - (BOOL)canBecomeFirstResponder{
  4. return YES;
  5. }
  6. //"反馈"关心的功能
  7. -(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
  8. return (action == @selector(copy:));
  9. }
  10. //针对于copy的实现
  11. -(void)copy:(id)sender{
  12. UIPasteboard *pboard = [UIPasteboard generalPasteboard];
  13. pboard.string = self.text;
  14. }
  15. //UILabel默认是不接收事件的,我们需要自己添加touch事件
  16. -(void)attachTapHandler{
  17. self.userInteractionEnabled = YES;  //用户交互的总开关
  18. UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
  19. touch.numberOfTapsRequired = 2;
  20. [self addGestureRecognizer:touch];
  21. [touch release];
  22. }
  23. //绑定事件
  24. - (id)initWithFrame:(CGRect)frame
  25. {
  26. self = [super initWithFrame:frame];
  27. if (self) {
  28. [self attachTapHandler];
  29. }
  30. return self;
  31. }
  32. //同上
  33. -(void)awakeFromNib{
  34. [super awakeFromNib];
  35. [self attachTapHandler];
  36. }
  37. -(void)handleTap:(UIGestureRecognizer*) recognizer{
  38. [self becomeFirstResponder];
  39. UIMenuController *menu = [UIMenuController sharedMenuController];
  40. [menu setTargetRect:self.frame inView:self.superview];
  41. [menu setMenuVisible:YES animated:YES];
  42. }
  43. @end

在view里添加一个UICopyLabel

现在可以使用UICopyLabel实现双击来对label的内容copy了

在你的view中

UICopyLabel *display = [[UICopyLabelalloc]initWithFrame:CGRectMake(30,100,250,30)];

awakeFromNib

在使用IB的时候才会涉及到此方法的使用,当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。

看例子:

创建一个viewController with XIB

定义一个UIView的子类

打开xib,并把View的类型指定为上一步骤定义的子类

然后在TestView.m中加入 awakeFromNib方法,运行程序发现此方法被调用了!!!

 

 

下面我们来定制菜单

attachTapHandler中添加长按压手势

  1. -(void)attachTapHandler{
  2. self.userInteractionEnabled = YES;  //用户交互的总开关
  3. //双击
  4. UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
  5. touch.numberOfTapsRequired = 2;
  6. [self addGestureRecognizer:touch];
  7. [touch release];
  8. //长按压
  9. UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];
  10. press.minimumPressDuration = 1.0;
  11. [self addGestureRecognizer:press];
  12. [press release];
  13. }

添加方法longPress

  1. - (void)longPress:(UILongPressGestureRecognizer *)recognizer {
  2. if (recognizer.state == UIGestureRecognizerStateBegan) {
  3. //   TSTableViewCell *cell = (TSTableViewCell *)recognizer.view;
  4. [self becomeFirstResponder];
  5. UIMenuItem *flag = [[UIMenuItem alloc] initWithTitle:@"Flag" action:@selector(flag:)];
  6. UIMenuItem *approve = [[UIMenuItem alloc] initWithTitle:@"Approve" action:@selector(approve:)];
  7. UIMenuItem *deny = [[UIMenuItem alloc] initWithTitle:@"Deny" action:@selector(deny:)];
  8. UIMenuController *menu = [UIMenuController sharedMenuController];
  9. [menu setMenuItems:[NSArray arrayWithObjects:flag, approve, deny, nil]];
  10. [menu setTargetRect:self.frame inView:self.superview];
  11. [menu setMenuVisible:YES animated:YES];
  12. NSLog(@"menuItems:%@",menu.menuItems);
  13. }
  14. }
  15. - (void)flag:(id)sender {
  16. NSLog(@"Cell was flagged");
  17. }
  18. - (void)approve:(id)sender {
  19. NSLog(@"Cell was approved");
  20. }
  21. - (void)deny:(id)sender {
  22. NSLog(@"Cell was denied");
  23. }

修改canPerformAction

  1. -(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
  2. //    return (action == @selector(copy:));
  3. if (action == @selector(copy:)||action == @selector(flag:)||action == @selector(approve:)||action == @selector(deny:)) {
  4. return YES;
  5. }
  6. }

ok。。。效果如图

 
 

UIMenuController的使用,对UILabel拷贝以及定制菜单的更多相关文章

  1. UIMenuController搭配UIPasteboard,执行拷贝-黏贴操作-b

    一.基本概念 UIKit框架中,可以直接执行拷贝黏贴操作的有:UITextView.UITextField和UIWebView,其他控件需要实现相关方法. 关于UIPasteboard ·黏贴板是ap ...

  2. ios 复制黏贴板的使用

    在iOS中,可以使用剪贴板实现应用程序之中以及应用程序之间实现数据的共享.比如你可以从iPhone QQ复制一个url,然后粘贴到safari浏览器中查看这个链接的内容. 一.在iOS中下面三个控件, ...

  3. UIMenuController的使用

    1, 基本使用 以对一个UILabel长按弹出菜单为例 子类化UILabel 因为需要覆盖这几个方法:- (BOOL)canBecomeFirstResponder; 返回YES 同时需要在每次UI元 ...

  4. iOS苹果自带UIMenuController

    一.UIMenuController认识 1.默认情况下,UITextView / UITextFiled / UIWebView 都有苹果自带的有UIMenuController功能 2.UITex ...

  5. 【VS Hacks】定制VS

    # Hack 24   定制快捷键 VS能够做很多键盘的配置,其实在VS中目前已经发现有很多的快捷键了,但是在这个技巧篇里会学到如何创建新的快捷键,以及编辑已有的快捷键.VS中包含很多的命令,只有其中 ...

  6. iOS UIGestureRecognizer与UIMenuController(内容根据iOS编程)

    UIGestureRecognizer 对象会截取本应由视图处理的触摸事件.当某个UIGestureRecognizer对象识别出特定的手势后,就会向指定的对象发送指定的消息.iOS SDK默认提供若 ...

  7. 浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

    原文:浏览器扩展系列----在WPF中定制WebBrowser快捷菜单 关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/book ...

  8. iOS 使用 UIMenuController 且不隐藏键盘的方法

    iOS 使用 UIMenuController 且不隐藏键盘的方法 在键盘显示的时候使用 UIMenuController 弹出菜单,保持键盘显示且可输入的状态. 实现方法有 修改响应链(推荐) 遵循 ...

  9. qt之菜单项定制

    qt实现菜单,简单的界面QMenu+QAction完全可以实现,在加上qss的支持,可以定制出比较美观的菜单,qt的菜单一般用在托盘.按钮和工具栏上. 当然啦,也有很多软件有比较美观的托盘菜单,比如3 ...

随机推荐

  1. Linux常用命令(四)

    1.xargs 作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题 语法格式: # xargs [-ni] 常用参数: 参数 参数说明 -n 分组输出,n个分为一组 -i 与大括号 ...

  2. python学习之字符串变量

    1.字符串引用变量 name="Jasper" age=23 msg="my name is %s,my age is %s"%(name,age) print ...

  3. java解析json与map,list相互之间的转换

    运行这个类需要加载jar包:ezmorph-1.0.6.jar.json-lib-2.4-jdk15.jar.jsoup-1.6.1.jar.commons-beanutils-1.8.0.jar.c ...

  4. Python 基础练习

    今天接触了python,了解了一下 python 的基础语法,于是想着手训练一下,在本习题集中,参考代码为提供的参考答案,前面的代码为自己思考的代码,最后每道题给出练习的时间. Python 基础练习 ...

  5. MYSQL转换JSON

    http://51strive.com/ <!DOCTYPE html><html><head><meta charset="UTF-8" ...

  6. IE6兼容性问题及IE6常见bug详细汇总

    转载地址:http://www.jb51.net/css/76894.html 1.IE6怪异解析之padding与border算入宽高 原因:未加文档声明造成非盒模型解析 解决方法:加入文档声明&l ...

  7. (十)Linux 网络编程之ioctl函数

    1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的 ...

  8. Android:padding和android:layout_margin的区别

    padding是站在父view的角度描述问题,它规定它里面的内容必须与这个父view边界的距离. margin则是站在自己的角度描述问题,规定自己和其他(上下左右)的view之间的距离

  9. Deep Learning 6_深度学习UFLDL教程:Softmax Regression_Exercise(斯坦福大学深度学习教程)

    前言 练习内容:Exercise:Softmax Regression.完成MNIST手写数字数据库中手写数字的识别,即:用6万个已标注数据(即:6万张28*28的图像块(patches)),作训练数 ...

  10. mybatis 模糊查询 like

    1.  参数中直接加入%% param.setUsername("%CD%");      param.setPassword("%11%"); <sel ...