前言
- 在使用iPhone時(shí),長按文本視圖或編輯框會(huì)出現(xiàn)復(fù)制粘貼視圖,在iOS中該視圖叫做UIMenuController,最近項(xiàng)目中需要自定義復(fù)制和刪除操作,就了解了一些UIMenuController基本的使用方法.
UIMenuController基本使用
- 在顯示UIMenuController的時(shí)候,被顯示視圖
canBecomeFirstResponser
方法返回值必須為Yes,該方法是UIView的方法,而繼承與View的Lable和Cell默認(rèn)返回值是NO,所以要重寫該方法,并始終返回YES.
-(BOOL)canBecomeFirstResponder{
return YES;
}
- 1.Cell和Lable我們用手勢(shì)來綁定方法,并自定義UIMenuController要顯示的內(nèi)容.
// 添加長按手勢(shì)
UILongPressGestureRecognizer * longPress=[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(cellLongPress:)];
[cell addGestureRecognizer:longPress];
- 2.當(dāng)觸發(fā)手勢(shì)方法的時(shí)候,要把視圖加入響應(yīng)者鏈條,才能完整的響應(yīng)整個(gè)事件,UIMenuController才能顯示出來,首先獲取響應(yīng)手勢(shì)的視圖,再調(diào)用
becomeFirstResponder
方法,并且手勢(shì)方法有各種狀態(tài),所以方法的調(diào)用是多次的,為了只執(zhí)行一次,一般加上判斷條件.
-(void)cellLongPress:(UIGestureRecognizer *)recognizer{
if (recognizer.state==UIGestureRecognizerStateBegan )
MessageCell * messageCell=(MessageCell *)recognizer.view;
[messageCell becomeFirstResponder];
}
- 3.顯示UIMenuController時(shí),最重要就是顯示的塊內(nèi)容,因此先拼裝塊內(nèi)容UIMenuItem,以下初始化兩個(gè)Item,并綁定自定義方法.
UIMenuItem * copyItem=[[UIMenuItem alloc] initWithTitle:@"復(fù)制" action:@selector(myCopy:)];
UIMenuItem * deleateItem=[[UIMenuItem alloc] initWithTitle:@"刪除" action:@selector(myDeleate:)];
- 4.最后就是獲取UIMenuController單利,把Item塞進(jìn)去,并顯示出來,最后要注意設(shè)置顯示位置,傳入的Rect要和view是在同一參照坐標(biāo)系中.
// 獲取UIMenuController單例
UIMenuController * menuControl=[UIMenuController sharedMenuController];
// 塞進(jìn)UIMenuController中
[menuControl setMenuItems:[NSArray arrayWithObjects:copyItem,deleateItem ,nil]];
// 設(shè)置要顯示的位置
[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.最后就是兩個(gè)自定義的item方法.
-(void)myCopy:(id)sender
{
//獲取粘貼板單例并把Cell中的文本值賦入
[[UIPasteboard generalPasteboard] setString:self.currentSelectMessgaeCell.contentBtn.currentTitle];
}
-(void)myDeleate:(id)sender
{
// 刪除環(huán)信某一條聊天(項(xiàng)目中用到環(huán)信聊天)
NSString * messageID=self.currentSelectMessgaeCell.messageFrame.message.messageId;
if ([self.conversation removeMessageWithId:messageID]) {
// 根據(jù)Cell定位Cell的位置
NSIndexPath * path = [self.tableView indexPathForCell:self.currentSelectMessgaeCell];
// 根據(jù)位置刪除內(nèi)存數(shù)據(jù)
[self.tableDataSource removeObjectAtIndex:path.row];
// 再刪除對(duì)應(yīng)位置的Cell
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationRight];
}
}
UIMenuController的使用并不難,蘋果已經(jīng)封裝好了一些原子化操作,只需要我們拼裝起來就行了