参考原文
苹果自带的UIMenuController功能扩展
下面实现的效果如下图
下面代码是自定义UITextField类的.m文件,.h中为空,如用Category会影响到全文
一、UIMenuController认识
- 默认情况下,UITextView / UITextFiled / UIWebView 都有苹果自带的有UIMenuController功能
- UITextFiled 的弹出菜单效果是系统自带的
二、UIMenuController基本使用
- 如为指定控件添加该功能;我们可以自定义;
- 通过sharedMenuController获取单例对象;
- 必须手动设置弹窗菜单可见;
- 指定弹窗相对哪个View的哪个位置显示;
- 指定其显示方向(上下左右);
- 指定Item多个(数组);
- 而且可以指定menuFrame;不仅如此,系统也提供了可以监听menu的通知(即将显示/完全显示、即将隐藏/完全隐藏、menu的frame改变)
具体实现如下:
- 获得菜单 menu
UIMenuController *menu = [UIMenuController sharedMenuController]; 设置菜单最终显示的位置
123456// 菜单最终显示的位置CGRect rect = CGRectMake(100, 100, 100, 100);[menu setTargetRect:rect inView:self.label];//// targetRect:menuController指向的矩形框//targetView:targetRect以targetView的左上角为坐标原点手动设置需要,显示菜单
[menu setMenuVisible:YES animated:YES];- 必须要得通过第一响应者,来告诉MenuController它内部应该显示什么内容
a. 让第一响应者,实现下面方法,来告诉显示内容,监听哪些操作action
|
|
- 设置第一响应者
a. 前提是:必须要有第一响应者,让第一响应者,实现上面方法,告诉显示什么内容。实现下面方法,可以让某个视图或者控制器,成为第一响应者: canBecomeFirstResponder方法。
|
|
实现监听菜单内容的对应的action方法
监听到menu菜单的显示与隐藏与frame改变的通知
如下:监听menu即将显示的通知
1.注册通知监听
// 注册监听 菜单即将显示 通知
2.实现监听到menu菜单显示调用方法
3.dealloc方法中,移除通知监听
设置menu支持中文,显示中文 ->修改软件应用支持中文
- 解决方案:查看UIMenuController的头文件,我们发现有个属性menuItems数组,通过它我们可以增加额外的菜单项,自定义meun显示自己定义的文字
注意:
创建只能通过[UIMenuController sharedMenuController];单例方式获取,不能通过init方式创建,否则报如下错误
获得菜单 -> 回报如下错误UIMenuController *menu = [[UIMenuController alloc] init]; Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There can only be one UIMenuController instance.'
三、应用
- 如何给Label添加UIMenuController功能
1.设置UILabel允许交互
2.给UILabel添加手势,
3.在UILabel手势监听方法中,创建UIMenuController-》menu
4.设置menu位置,利用UIMenuController的对象方法setTargetRect: inView:方法来设置menu显示在在那个控件的那个位置
6.显示menu, -》 menu setMenuVisible: animation:
7.设置menu显示内容
注意:得通过第一响应者,来告诉menu它内部显示什么内容。如果显示中文标题,就需要手动设置APP支持中文
实现:
7.1让label成为第一响应者(注意:不一定第一响应者必须是控制器)
7.2设置menu显示menuItem,告诉menu可以显示什么内容。
|
|