iOS-UIMenuController的基本使用

前言

  • 在使用iPhone时,长按文本视图或编辑框会出现复制粘贴视图,在iOS中该视图叫做UIMenuController,最近项目中需要自定义复制和删除操作,就了解了一些UIMenuController基本的使用方法.

UIMenuController基本使用

  • 在显示UIMenuController的时候,被显示视图 canBecomeFirstResponser方法返回值必须为Yes,该方法是UIView的方法,而继承与View的Lable和Cell默认返回值是NO,所以要重写该方法,并始终返回YES.
-(BOOL)canBecomeFirstResponder{
    return YES;
}
  • 1.Cell和Lable我们用手势来绑定方法,并自定义UIMenuController要显示的内容.
// 添加长按手势
 UILongPressGestureRecognizer * longPress=[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(cellLongPress:)];
 [cell addGestureRecognizer:longPress];
  • 2.当触发手势方法的时候,要把视图加入响应者链条,才能完整的响应整个事件,UIMenuController才能显示出来,首先获取响应手势的视图,再调用becomeFirstResponder方法,并且手势方法有各种状态,所以方法的调用是多次的,为了只执行一次,一般加上判断条件.
-(void)cellLongPress:(UIGestureRecognizer *)recognizer{ 
if (recognizer.state==UIGestureRecognizerStateBegan )   
MessageCell * messageCell=(MessageCell *)recognizer.view;  
[messageCell becomeFirstResponder];
}
  • 3.显示UIMenuController时,最重要就是显示的块内容,因此先拼装块内容UIMenuItem,以下初始化两个Item,并绑定自定义方法.
UIMenuItem * copyItem=[[UIMenuItem alloc] initWithTitle:@"复制" action:@selector(myCopy:)];
UIMenuItem * deleateItem=[[UIMenuItem alloc] initWithTitle:@"删除" action:@selector(myDeleate:)];
  • 4.最后就是获取UIMenuController单利,把Item塞进去,并显示出来,最后要注意设置显示位置,传入的Rect要和view是在同一参照坐标系中.
//   获取UIMenuController单例
UIMenuController * menuControl=[UIMenuController sharedMenuController];
//   塞进UIMenuController中
[menuControl setMenuItems:[NSArray arrayWithObjects:copyItem,deleateItem ,nil]];
//   设置要显示的位置
[menuControl setTargetRect:CGRectMake(messageCell.contentBtn.frame.origin.x, messageCell.contentBtn.frame.origin.y, messageCell.contentBtn.frame.size.width, messageCell.contentBtn.frame.size.height) inView:messageCell];
//   显示出来
 [menuControl setMenuVisible:YES animated:YES];
  • 5.最后就是两个自定义的item方法.
-(void)myCopy:(id)sender
{
//获取粘贴板单例并把Cell中的文本值赋入
    [[UIPasteboard generalPasteboard] setString:self.currentSelectMessgaeCell.contentBtn.currentTitle];
}
-(void)myDeleate:(id)sender
{
//    删除环信某一条聊天(项目中用到环信聊天)
    NSString * messageID=self.currentSelectMessgaeCell.messageFrame.message.messageId;
    if ([self.conversation removeMessageWithId:messageID]) {
//    根据Cell定位Cell的位置
        NSIndexPath * path = [self.tableView indexPathForCell:self.currentSelectMessgaeCell];
//    根据位置删除内存数据
        [self.tableDataSource removeObjectAtIndex:path.row];
//    再删除对应位置的Cell
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationRight];
    }
}

UIMenuController的使用并不难,苹果已经封装好了一些原子化操作,只需要我们拼装起来就行了

你可能感兴趣的:(iOS-UIMenuController的基本使用)