自定义剪贴板,在复制时,键盘不退出的方法

本人在网上看到的大部分关于自定义剪贴板的文章,按照文章上的方法操作,点击复制时,键盘总会退出,对此经历了百般折磨.终于在stackoverflow上找到了解决办法.

4420241.png

一般场景就像聊天界面一样,必然后一个输入框,和一个需要剪切板的文本,就像上图一样的聊天界面.
处理方法,自定义输入框的类如:MATextView

MATextView.h
@interface MATextView : UITextView
@property (nonatomic, weak) UIResponder *inputNextResponder;
@end

MATextView.m
@implementation MATextView
- (UIResponder *)nextResponder {
 if (_inputNextResponder != nil)
    return _inputNextResponder;
  else
    return [super nextResponder];
}
@end 

在需要剪贴板的地方的长按方法如下编写

- (void)chatMessageBtnLongTap:(UILongPressGestureRecognizer *)longTap
{
    // 菜单已经打开不需重复操作
    UIMenuController *menu=[UIMenuController sharedMenuController];
    if (menu.isMenuVisible)return;

   if ([_textView isFirstResponder]) {
       _textView.inputNextResponder = self;//关键代码
    }else{
      [self becomeFirstResponder];
   }
    
     UIMenuItem *copy = [[UIMenuItem alloc] initWithTitle:@"复制"action:@selector(copyItem:)];
    [menu setMenuItems:@[copy]];
    [menu setTargetRect:self.chatMessageBackgroundView.frame inView:self.contentView];
    [menu setMenuVisible:YES animated:YES];
    self.chatMessageBackgroundView.highlighted = YES;
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(copyBtnWillHidden) name:UIMenuControllerWillHideMenuNotification object:nil];
}

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
    if(action ==@selector(copyItem:)){
        return YES;
    }
    return [super canPerformAction:action withSender:sender];
}

- (BOOL)canBecomeFirstResponder{
    return YES;
}

-(void)copyItem:(id)sender{
    [[UIPasteboard generalPasteboard]setString:_chatMessage.content];
}

- (void)copyBtnWillHidden{
    UIView *superView =  self.superview.superview.superview;
    KFChatToolView *toolView = [superView viewWithTag:kKF5ChatToolViewTag];
    if ([toolView isKindOfClass:[KFChatToolView class]]) {
            toolView.textView.inputNextResponder = nil;
    }
    self.chatMessageBackgroundView.highlighted = NO;
    [[NSNotificationCenter defaultCenter]removeObserver:self];
}
- (void)dealloc{
    [[NSNotificationCenter defaultCenter]removeObserver:self];
}

注意: 需要在UITableView的代理中添加scrollViewWillBeginDragging:手指滚动时,隐藏菜单

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
     // 隐藏菜单
    UIMenuController *menu=[UIMenuController sharedMenuController];
    [menu setMenuVisible:NO];
    // 隐藏键盘
    [self.textView resignFirstResponder];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,385评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,245评论 4 61
  • 昨晚宝宝又化身睡渣。晚上不停地叫,给奶只能安抚一段时间。冷了?热了?尿了?好像都不是。应该是睡不着频繁依赖夜奶来使...
    圣徒徒阅读 153评论 0 0
  • (转)详解spring 每个jar的作用 spring.jar 是包含有完整发布模块的单个jar 包。但是不包括m...
    congnie116阅读 1,456评论 1 7