開發(fā)時(shí)有時(shí)會(huì)遇到捉超,textView為第一響應(yīng)時(shí),menu菜單要顯示绍昂,若不移除textView響應(yīng)啦粹,會(huì)導(dǎo)致menu菜單顯示textView的系統(tǒng)菜單偿荷,粘貼、選擇等唠椭。
如下圖
如果移除響應(yīng)跳纳,體驗(yàn)會(huì)很不好,尤其是即時(shí)通訊App贪嫂。
嘗試了多種方法后寺庄,找到一種簡(jiǎn)單的方法,且可以menu力崇、鍵盤二者共存斗塘。
就是繼承一個(gè)系統(tǒng)TextView,h文件添加一個(gè)屬性isShowMenu亮靴,m文件中重寫canPerformAction方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
? ? //攔截menu菜單
? ? if(self.isShowMenu)
? ? {
? ? ? ? return ?NO;
? ? }
? ? else
? ? {
? ? ? ? return ?[supercanPerformAction:action withSender:sender];
? ? }
}
之后馍盟,在初始化menu的地方加上第一響應(yīng)判斷
? ? ? ? if([self.myTextView isFirstResponder])
? ? ? ? {
? ? ? ? ? ? self.myTextView.isShowMenu = YES;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? [self becomeFirstResponder];
? ? ? ? }
? ? ? ? NSMutableArray *menuItems = [[NSMutableArray alloc] init];
? ? ? ? UIMenuItem *itCopy = [[UIMenuItem alloc] initWithTitle:@"復(fù)制" action:@selector(handleCopyItem)];
? ? ? ? [menuItems addObject:itCopy];
? ? ? ? UIMenuItem *deleteItem = [[UIMenuItem alloc] initWithTitle:@"刪除" action:@selector(handleDeleteItem)];
? ? ? ? [menuItems addObject:deleteItem];
? ? ? ? UIMenuItem *replyItem = [[UIMenuItem alloc] initWithTitle:@"收藏" action:@selector(handleColectItem)];
? ? ? ? [menuItems addObject:replyItem];
? ? ? ? [UIMenuController sharedMenuController].menuItems = menuItems;
? ? ? ? [[UIMenuController sharedMenuController] ?setTargetRect:CGRectMake(0, 0, view.frame.size.width, view.frame.size.height) inView:view];
? ? ? ? [[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
最后一步,在控制器里面添加menu消失的通知茧吊,在通知里面重置isShowMenu
? ? [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuControllerWillHide:) name:UIMenuControllerWillHideMenuNotification object:nil]; ?
- (void)menuControllerWillHide: (NSNotification*)notification
{
? ? //還原menu
? ? [[UIMenuController sharedMenuController] setMenuItems:@[]];
? ? self.myTextView.isShowMenu = NO;
}
就大功告成了贞岭!是不是很easy,又可以愉快的玩耍了
修改完成后結(jié)果
附demo地址:?