UIMenuController的展现需要基于一个View视图,其交互则需要基于其所在View视图的Responder。举例来说,如果一个UIMenuController展现在当前ViewController的View上,则此UIMenuController的交互逻辑交由当前的ViewController进行管理。

  在界面展示出UIMenuController需要3个条件:

1.当前的Responder处于第一响应。

2.UIMenuController对象调用menuVisible方法。

3.当前的Responder实现了如下两个方法:

//是否可以成为第一相应
-(BOOL)canBecomeFirstResponder{
  return YES;
}
//是否可以接收某些菜单的某些交互操作
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
    return YES;
}
  实现了上面的两个方法,使用如下的代码可以唤出UIMenuController控件:
[self becomeFirstResponder];
//设置菜单显示的位置 frame设置其文职 inView设置其所在的视图
[[UIMenuController sharedMenuController] setTargetRect:frame inView:self.view];
//将菜单控件设置为可见
[UIMenuController sharedMenuController].menuVisible = YES;
 
  在执行了上面的代码后,系统第一次调用canperformAction:withSender:方法会进行是否显示菜单栏的检测,如果返回为NO,则不能显示菜单栏,如果返回为YES,之后系统会多次调用canPerformAction:withSender:方法,用于检测当前Responder对象是否实现了菜单栏上某个选项的触发方法,如果实现了,菜单栏上面的相应按钮会显示,否则不会显示。开发者可以在这个方法中通过判断action来确定菜单控件中显示的按钮种类。系统默认为开发者提供了一系列的菜单按钮,例如要显示剪切和赋值操作的菜单按钮,示例代码如下:
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
  if (action == @selector(cut:)||action == @selector(copy:)) {
    return YES;
  }
  return NO;
}
 
系统默认支持提供的按钮触发方法列举如下:
//剪切按钮的方法
- (void)cut:(nullable id)sender NS_AVAILABLE_IOS(3_0);
//复制按钮的方法
- (void)copy:(nullable id)sender NS_AVAILABLE_IOS(3_0);
//粘贴按钮的方法
- (void)paste:(nullable id)sender NS_AVAILABLE_IOS(3_0);
//选择按钮的方法
- (void)select:(nullable id)sender NS_AVAILABLE_IOS(3_0);
//全选按钮的方法
- (void)selectAll:(nullable id)sender NS_AVAILABLE_IOS(3_0);
//删除按钮的方法
- (void)delete:(nullable id)sender NS_AVAILABLE_IOS(3_2);
//改变书写模式为从左向右按钮触发的方法
- (void)makeTextWritingDirectionLeftToRight:(nullable id)sender NS_AVAILABLE_IOS(5_0);
//改变书写模式为从右向左按钮触发的方法
- (void)makeTextWritingDirectionRightToLeft:(nullable id)sender NS_AVAILABLE_IOS(5_0);
 
 
UIMenuItem类提供给开发者进行自定义菜单按钮与触发方法,示例如下:
 [self becomeFirstResponder];
 
  UIMenuItem * item = [[UIMenuItem alloc]initWithTitle:@"自定义" action:@selector(newFunc)];
  [[UIMenuController sharedMenuController] setTargetRect:[sender frame] inView:self.view];
  [UIMenuController sharedMenuController].menuItems = @[item];
  [UIMenuController sharedMenuController].menuVisible = YES;
-(BOOL)canBecomeFirstResponder{
  return YES;
}
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
  if (action == @selector(newFunc)) {
    return YES;
  }
  return NO;
}
-(void)newFunc{
  NSLog(@"自定义方法");
}
 
UIMenuController还有如下的属性用来设置其显示的位置:
//显示的位置
@property(nonatomic) UIMenuControllerArrowDirection arrowDirection;
//枚举如下:
/*
typedef NS_ENUM(NSInteger, UIMenuControllerArrowDirection) {
  //默认 基于当前屏幕状态
  UIMenuControllerArrowDefault, // up or down based on screen location
  //箭头在上的显示模式
  UIMenuControllerArrowUp NS_ENUM_AVAILABLE_IOS(3_2),
  //箭头在下的显示模式
  UIMenuControllerArrowDown NS_ENUM_AVAILABLE_IOS(3_2),
  //箭头在左的显示模式
  UIMenuControllerArrowLeft NS_ENUM_AVAILABLE_IOS(3_2),
  //箭头在右的显示模式
  UIMenuControllerArrowRight NS_ENUM_AVAILABLE_IOS(3_2),
};
*/

注意:
要正常显示菜单,必须做到以下几点:
1. -(BOOL)canBecomeFirstResponder 必须返回YES

2. -(BOOL)canPerformAction:(SEL)action withSender:(id)sender
该函数中,要显示的菜单项(包括系统的菜单项)的方法必须返回YES

3. 在显示菜单前,必须调用:

[self becomeFirstResponder];

成为第一个响应者

4. 为了马上可以正常显示第二个菜单,必须使用:

[menuController setMenuVisible:NO];

先关闭一下,不然就显示不出来!

 

最新文章

  1. hudson部署过程
  2. jQuery-3~4章
  3. (转载)HTML5 LocalStorage 本地存储
  4. asp.net web常用控件FileUpload(文件上传控件)
  5. [NOIP2015] 提高组 洛谷P2678 跳石头
  6. windows下php连接sqlserver2008
  7. shell调试
  8. log4Net使用 z
  9. LightOJ 1422 Halloween Costumes 区间dp
  10. c#里listview里如何获取点击的是哪一列
  11. Unity相对于Cocos2d-x的比较
  12. Cairo-Dock 系统关机无效
  13. 用JSON.stringify处理循环引用对象
  14. pytorch bug
  15. mac下pycharm快捷键
  16. 终端复用软件 tmux
  17. pip的问题小结
  18. 3种方法轻松处理php开发中emoji表情的问题
  19. CorelDRAW X4常用快捷键大全
  20. python3 下载 以及 练习1 以及 pycharm 专业版 安装

热门文章

  1. ORACLE 11g RAC-RAC DG Duplicate 搭建(生产操作文档)
  2. POJ 1945 暴搜+打表 (Or 暴搜+判重)
  3. [转] CentOS 7 为firewalld添加开放端口及相关资料
  4. shell-3.bash的基本功能: history tab alias 快捷键
  5. SpringCloud学习笔记(14)----Spring Cloud Netflix之Hystrix对Feign的支持
  6. 解析浏览器和nodejs环境下console.log()的区别
  7. 页面加载完成触发input[type="file"]控件问题
  8. canvas 连线曲线图
  9. Django之ORM的增删改查
  10. python基础7(函数 Ⅱ)