iOS UIMenuController简介及使用 —— HERO博客

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:方法,效果以下:



写博客的初心是但愿你们共同交流成长,博主水平有限不免有偏颇之处,欢迎批评指正。