前言
- 在使用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的使用并不难,苹果已经封装好了一些原子化操作,只需要我们拼装起来就行了