您的位置:首页 > 产品设计 > UI/UE

UIMenuController的使用

2016-03-01 14:32 447 查看

UIMenuController的使用

编辑菜单是一个显示的,可以用来执行一个功能的上下文菜单,类似text view里的一段文本或一张图片。主要组成部分是复制、剪切和粘贴等操作,它显示的命令基本是复制、剪切、粘贴、选择和全选等。不过也可以自己增加自定义的菜单项,使得选择它时可以执行其他的一些操作。

管理选项和菜单

不管用户是复制或剪切一个视图中的某些东西或者其他事,总是会有“一些东西”会被选择,可能是一段文本,一副图片,一个URL地址,一种颜色或以其他方式呈现的数据,包括用户自定义的数据。在你自己的视图中你必须使用一个东西来管理选中的东西。如果用户通过一个确定的点击手势选择一个物体(比如双击),你必须去处理这些事件,记录这些选择(并且取消之前的任何选择),并且可能在视图中显示的呈现一些可见的指示。如果用户在视图中选择了多个物体以执行复制、剪切、粘贴等操作,你就必须实现那些多选行为。

当你的app需要使用一个能响应用户做出的选择的菜单的时候,你可以按照以下步骤去显示一个菜单:

1. 调用UIMenuController中的类方法sharedMenuController获得一个全局的UIMenuController实例

2. 计算选项的范围并且用这个矩形(CGRect)调用setTargetRect:inView:方法,编辑菜单会根据上面或下面到屏幕的距离自动显示在这个矩形的上面或下面。

3. 调用setMenuVisible:animated:方法(两个参数全部传入YES)以动画效果显示编辑菜单

双击显示一个菜单的代码如下所示:

-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
UITouch* theTouch = [touches anyObject];
if([UITouch tapCount] == 2 && [self becomeFirstResponder]) {
UIMenuController* theMenu = [UIMenuController sharedMenuController];
CGRect selectionRect = CGRectMake(currentSelection.x, currentSelection.y, SIDE, SIDE);
[theMenu setTargetRect:selectionRect inView:self];
[theMenu setMenuVisible:YES animated:YES];
}

return ;
}


这样一个为第一响应者(必须是第一响应者,我在刚刚使用UIMenuController的时候怎么都显示不出来,后来才知道原来是这个问题)显示的菜单实例包括所有的命令(比如复制、剪切、粘贴等),不过系统将会在菜单显示之前发出一个canPerformAction:withSender:消息给第一响应者,在这个方法中,响应者可以通过selector来确定到底需要哪些命令,比如说如果selector是paste:并且在粘贴板中没有任何数据,那么响应者就应该返回NO来禁用粘贴命令。如果第一响应者没有实现canPerformAction:withSender:方法或者没有处理给出的命令,那么该消息就会沿响应链一直往下传递。

启用或禁用菜单项

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {
BOOL retValue = NO;
ColorTitle* theTitle = [self colorTitleForOrigin:currentSelction];

if(action == @selector(paste:)) {
retValue = (theTitle == nil) &&
[[UIPasteboard generalPasteboard] containPasteboardTypes:[NSArray arrayWithObject:ColorTitleUTI]];
}else if(action == @selector(cut:) || action == @selector(copy:))
retValue = (theTitle != nil);
else
retValue = [super canPerformAction:action withSender:sender];

return retValue;
}


该方法中最后一个else语句调用父类的实现,通过这种方式交给父类去处理所有子类忽略的命令

增加自定义菜单项

用户也可以增加自己定义的菜单项到编辑菜单中。当用户点击该项的时候,一个通过app指定方式的命令就将会被执行。UIKit通过target-action机制完成这项功能。点击该荐的时候便会向响应链中能处理该方法的第一响应者发送消息,下图展示了一个自定义的菜单项(“Change Color”).



一个UIMenuItem的实例代表了一个自定义菜单项,UIMenuItem对象有两个属性,包括标题和动作方法,用户可以在任何时候进行修改。要实现一个自定义的菜单项,用户必须使用这两个属性初始化一个UIMenuItem实例,并把这个实例增加到编辑菜单的menuItems数组当中。然后在响应的类中实现该菜单项对应的方法。

另外,实现自定义菜单项的通用方法是通过UIMenuController这个单例对象,在自定义或继承的视图中,设置该视图为第一响应者,获取sharedMenuController,设置目标矩形,调用setMenuVisible:animated:显示菜单,代码基本一致。下例展示了一个用于使视图的背景色在红色和黑色之间切换的菜单。

-(void)touchesBegin:(NSSet*)touches withEvent:(UIEvent*)event{}
-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event{}
-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
UITouch* theTouch = [touches anyObject];
if([theTouch tapCount] == 2) {
[self becomeFirstResponder];
UIMenuItem* menuItem = [[UIMenuItem alloc] initWithTitle:@"Change Color" action:@selector(changeColor:)];
UIMenuController* menuController = [UIMenuController sharedMenuController];
[menuContoller setTargetRect:self.frame inView:self.superView];
[menuController setArrowDirection:UIMenuControllerArrowLeft];
[menuController setMenuItems:@[menuItem]];
[menuController setMenuVisible:YES animated:YES];
}

return ;
}


UIMenuController的arrowDirection属性允许用户指定添加到目标矩形上的编辑菜单的箭头指向

关闭菜单

当你实现的系统或自定义的方法返回之后,编辑菜单将会自动隐藏,不过你仍然可以使用下面这行代码让菜单继续显示:

[UIMenuController sharedMenuController].menuVisible = YES;


系统也可能在任何时刻隐藏菜单,比如当显示一个通知或者用户点击屏幕其他地方的时候。如果你需要在这些情况下仍然显示菜单,就必须监听UIMenuControllerWillHideMenuNotification通知做进一步的处理。

原文地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  菜单项-Menu