UIMenuController简介:app
UIMenuController为菜单控制器,是一个单例对象,继承NSObject,用来剪切、拷贝、粘贴等操做。
ide
UIMenuController使用:动画
获取UIMenuController对象:spa
UIMenuController *menu = [UIMenuController sharedMenuController];设置显示或者隐藏:code
//经过menuVisible属性设置,默认为NO,也能够经过该属性获取菜单栏显示状态 menu.menuVisible = YES; //经过setMenuVisible:(BOOL)menuVisible animated:方法设置,可设置动画 [menu setMenuVisible:YES animated:YES];设置显示位置(配合箭头方向设置):orm
[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(用于自定义菜单按钮):blog
UIMenuItem *printf = [[UIMenuItem alloc] initWithTitle:@"打印" action:@selector(printf:)];设置自定义菜单项(同时有系统菜单项和自定义菜单项,自定义菜单项会排在后面):继承
//menuItems默认为nil menu.menuItems = @[printf, audio];由于UIMenuController是一个单例对象,若是在一个控制器添加了自定义菜单项,那么在其余控制器仍会显示自定义菜单项,若不想显示,需先清空menuItems属性:get
- (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:方法,效果以下: