iOS UIMenuController简介及使用

释放双眼,带上耳机,听听看~!

UIMenuController简介:

UIMenuController为菜单控制器,是一个单例对象,继承NSObject,用来剪切、拷贝、粘贴等操作。

 

UIMenuController使用:

获取UIMenuController对象:

UIMenuController *menu = [UIMenuController sharedMenuController];

设置显示或者隐藏:

//通过menuVisible属性设置,默认为NO,也可以通过该属性获取菜单栏显示状态
menu.menuVisible = YES;
//通过setMenuVisible:(BOOL)menuVisible animated:方法设置,可设置动画
[menu setMenuVisible:YES animated:YES];

设置显示位置(配合箭头方向设置):

[menu setTargetRect:CGRectMake(0, cell.frame.size.height * 0.5, cell.frame.size.width, cell.frame.size.height) inView:cell];

设置箭头方向:

/*
UIMenuControllerArrowDefault, // 默认,基于在屏幕上的位置向上或向下
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), // 向右
*/
menu.arrowDirection = UIMenuControllerArrowLeft;

初始化菜单项UIMenuItem(用于自定义菜单按钮):

UIMenuItem *printf = [[UIMenuItem alloc] initWithTitle:@"打印" action:@selector(printf:)];

设置自定义菜单项(同时有系统菜单项和自定义菜单项,自定义菜单项会排在后面):

//menuItems默认为nil
menu.menuItems = @[printf, audio];

因为UIMenuController是一个单例对象,如果在一个控制器添加了自定义菜单项,那么在其他控制器仍会显示自定义菜单项,若不想显示,需先清空menuItems属性:

- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[UIMenuController sharedMenuController].menuItems = @[];
}

支持通知:

/*
UIMenuControllerWillShowMenuNotification       // 将要显示
UIMenuControllerDidShowMenuNotification        // 已经显示
UIMenuControllerWillHideMenuNotification       // 将要隐藏
UIMenuControllerDidHideMenuNotification        // 已经隐藏
UIMenuControllerMenuFrameDidChangeNotification // frame发生改变
*/

控件显示UIMenuController菜单栏需要可以成为firstResponder:

- (BOOL)canBecomeFirstResponder
{
return YES;
}

UITextField、UITextView、UIWebView自带UIMenuController菜单栏,拥有系统方法:

//允许执行的操作
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
NSLog(@"SEL : %@", NSStringFromSelector(action));
if (action == @selector(copy:) || action == @selector(printf:) || action == @selector(audioPlay:)) {
return YES;
}
return NO;
}
/*
通过打印可以看到有如下方法,前面加_为私有方法:
cut:
copy:
select:
selectAll:
paste:
delete:
_promptForReplace:
_transliterateChinese:
_insertDrawing:
_showTextStyleOptions:
_lookup:
_define:
_addShortcut:
_accessibilitySpeak:
_accessibilitySpeakLanguageSelection:
_accessibilityPauseSpeaking:
_share:
makeTextWritingDirectionRightToLeft:
makeTextWritingDirectionLeftToRight:
*/

让一个非默认支持UIMenuController菜单栏的控件显示菜单栏:

//自定义的方法,按上述先添加自定义菜单项,再实现相应方法
- (void)printf:(UIMenuController *)menu
{
NSLog(@"printf: %@", [[_infoArray[_row] model] text]);
}
//系统方法,直接实现相应方法即可
- (void)copy:(UIMenuController *)menu
{
NSString *str = [[_infoArray[_row] model] text];
if (!str) return;
[UIPasteboard generalPasteboard].string = str;
}

让一个默认支持UIMenuController菜单栏的控件不显示某项菜单项,可以实现一个子类继承该控件,重写canPerformAction: withSender:方法:

//重写canPerformAction: withSender:方法,禁止select菜单项显示
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(select:)) {
return NO;
}
return [super canPerformAction:action withSender:sender];
}

 

Demo下载链接:http://code.cocoachina.com/view/137002。

Demo一级页面是UITableView,实现了Cell长按显示菜单栏,可以复制、打印、语音播放Cell文本内容,单击Cell跳转二级页面,可选择保留或不保留自定义的打印、语音播放菜单项,可粘贴一级页面复制的文本内容,为UItextView隐藏系统select:方法,效果如下:

写博客的初心是希望大家共同交流成长,博主水平有限难免有偏颇之处,欢迎批评指正。

 

人已赞赏
iOS文章

iOS控件布局的几种方法总结

2020-2-22 23:32:49

iOS文章

iOS 进度条、加载、安装动画

2020-2-23 4:19:23

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索