UIMenuController使用

http://blog.csdn.net/piziliweiguang/article/details/8281007

当苹果在 iOS 3.0 中增加了剪切、复制和粘贴功能时,它同时为开发者提供了 UIMenuController 组件用来定制该弹出菜单,但不幸的是,最开始的实现要很麻烦:

  1. 附加在菜单的视图的 canBecomeFirstResponser 必须返回 YES,这意味着必须子类化。例如最常用的显示元素 UITableViewCell 和 UILabel 默认返回的是 NO
  2. UILongPressGestureRecognizer 直到 iOS 3.2 才提供, which means that the long press to initiate the menu display had to be implemented viatouchesBegan:withEvent:touchesMoved:withEvent:, andtouchesEnded:withEvent:. Every custom long press recognizer might use a different delay constant, which could easily confuse users who are used to another app‘s implementation.

而最新的 iOS 使用两种基本方法解决了这个问题,一个是表格单元格,另外一个是定制菜单选项。

指定情景: UITableViewCell on iOS 5

如果你只是想在 UITableViewCell 中使用系统提供的复制粘贴功能(大部分情况是这样),iOS 5.0 有更简单的方法:

01 - (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath {
02     return YES;
03 }
04  
05 - (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
06     if (action == @selector(copy:)) {
07         returnYES;    
08     }
09      
10     returnNO; 
11 }
12  
13 - (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
14     if (action == @selector(copy:)) {
15         [UIPasteboard generalPasteboard].string = [data objectAtIndex:indexPath.row];
16     }
17 }

该菜单调用 tableView:canPerformAction:forRowAtIndexPath:withSender 以确认是否该显示系统菜单选项并调用 tableView:performAction:forRowAtIndexPath:withSender: 当用户选择某个选项时.

定制菜单项

如果你想使用定制菜单项,下面代码比较隐晦,但非常灵活。你需要检测是否用户长按并显示菜单,而最简单的方法就是在表格单元格中使用 UILongPressGestureRecognizer

1 UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
2 [cell addGestureRecognizer:recognizer];

为了让菜单显示,目标视图必须在 responder 链中,很多 UIKit 视图默认并无法成为一个 responder ,因此你需要之类这些视图重载 canBecomeFirstResponder 方法范围 YES

在下面例子中,我们使用定制类 TSTableViewCell 并实现了长按选择器

01 - (void)longPress:(UILongPressGestureRecognizer *)recognizer { 
02     if (recognizer.state == UIGestureRecognizerStateBegan) {
03         TSTableViewCell *cell = (TSTableViewCell *)recognizer.view;
04         [cell becomeFirstResponder];
05          
06         UIMenuItem *flag = [[UIMenuItem alloc] initWithTitle:@"Flag"action:@selector(flag:)];
07         UIMenuItem *approve = [[UIMenuItem alloc] initWithTitle:@"Approve"action:@selector(approve:)];
08         UIMenuItem *deny = [[UIMenuItem alloc] initWithTitle:@"Deny"action:@selector(deny:)];
09  
10         UIMenuController *menu = [UIMenuController sharedMenuController];
11         [menu setMenuItems:[NSArray arrayWithObjects:flag, approve, deny, nil]];
12         [menu setTargetRect:cell.frame inView:cell.superview];
13         [menu setMenuVisible:YES animated:YES];
14     }
15 }
16  
17 - (void)flag:(id)sender {
18     NSLog(@"Cell was flagged");
19 }
20  
21 - (void)approve:(id)sender {
22     NSLog(@"Cell was approved");
23 }
24  
25 - (void)deny:(id)sender {
26     NSLog(@"Cell was denied");
27 }

There is only one small gotcha with UIMenuItem: if the specified action is not implemented by your view controller, that item will not appear in the menu.

时间: 2024-10-23 13:53:27

UIMenuController使用的相关文章

UIMenuController和UIMenuItem的使用

UIMenuController的方法: 1.创建menucontroller + (UIMenuController *)sharedMenuController; 2.设置是否可见 - (void)setMenuVisible:(BOOL)menuVisible animated:(BOOL)animated; 3.设置显示的位置 - (void)setTargetRect:(CGRect)targetRect inView:(UIView *)targetView; 4.有一个存储数据的属

Chapter 13 UIGestureRecognizer and UIMenuController

1. A UIGestureRecognizer intercepts touches that are on their way to being handled by a view. When it recognizes a particular gesture, it sends a message to the object of your choice. There are several types of gesture recognizers built into the SDK.

UIMenuController,UIPasteboard:复制,粘贴详解

首先用下面四张图,说明我要实现的功能.[讲一张图片复制到另外一个UIimageView上] 实现代码如下: -(IBAction)panGestureTop:(UILongPressGestureRecognizer *)longPress { UIMenuItem * itemPase = [[UIMenuItem alloc] initWithTitle:@"复制" action:@selector(copyimage)]; UIMenuItem * itemTrans = [[U

UIMenuController在label中的使用

要想在label中使用 必须是继承于label的分类 ////  MYlabel.m//  MenuController////  Created by 张明 on 16/3/8.//  Copyright © 2016年 张明. All rights reserved.// #import "MYlabel.h" @implementation MYlabel - (void)awakeFromNib{        [self setup];    } - (instancetyp

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

一.基本概念 UIKit框架中,可以直接执行拷贝黏贴操作的有:UITextView.UITextField和UIWebView,其他控件需要实现相关方法. 关于UIPasteboard ·黏贴板是app内或者app之间,交换数据的标准机制 ·有公开的也有私有的,公开的黏贴板为系统级别(system pasteboard),私有的黏贴板为应用程序级别(app pasteboard),系统级别的黏贴板可以分享数据给任意其他app,应用程序级别的黏贴板只能分享给应用本身或者有相同team ID的应用

UIMenuController

UIMenuController的示例 UIMenuController须知 默认情况下, 有以下控件已经支持UIMenuController UITextField UITextView UIWebView 让其他控件也支持UIMenuController(比如UILabel) 自定义UILabel 重写2个方法 ```objc /* * 让label有资格成为第一响应者/ - (BOOL)canBecomeFirstResponder { return YES; } /* * label能执

iOS苹果自带UIMenuController

一.UIMenuController认识 1.默认情况下,UITextView / UITextFiled / UIWebView 都有苹果自带的有UIMenuController功能 2.UITextFiled 的弹出菜单效果系统自带的      3.当然,系统只给某些控件提供的该功能,但是我们自己给可以给指定控件添加该功能效果,至于如何添加,我们先简单学习一下,如何使用系统提供的UIMenuController功能 二.UIMenuController基本使用 如何学UIMenuContro

UIMenuController在项目中的使用

//BCmessageCell文件代码 typealias BCChatCellAuxiliarytypeBlock = (cell:BCMessageCell,message:ArrowIMMessage,type:BCChatCellType)->Void var _auxiliaryBlock:BCChatCellAuxiliarytypeBlock? func longpressBubbleView(){ self.becomeFirstResponder() let menuContr

UIMenuController与UILabel

最近做项目,项目中有一处要使用pickerView进行日期的选择,即点击textField,下方弹出的不是键盘,而是pickerView.按要求,此textField不可编辑,由于弹出pickerView取代键盘的逻辑已经写好,我只需做两件事: (1)去掉此textField右侧的叉号(用于点击删除整行)    textField.clearButtonMode=UITextFieldViewNever; (2)禁用长按textField出现UIMenuController(选择/全选/剪切/黏

UIMenuController 简单示例 (Swift)

刚开始接触Swift,感觉是简单一些,但是有一些不习惯,没看基础知识,直接看demo! 可以和http://www.cnblogs.com/hissia/p/5668513.html里面的进行对比,挺容易掌握 直接上代码: 1 import UIKit 2 3 class ZWLabel: UILabel { 4 5 //MARK: 在storyboard中直接拖一个UILabel,然后设置类为ZWLabel 6 override func awakeFromNib() 7 { 8 // 用户交