美文网首页iOS开发 技术集锦iOSiOS Developer
UITextView 禁用文本选择+禁用复制粘贴

UITextView 禁用文本选择+禁用复制粘贴

作者: 吴佩在天涯 | 来源:发表于2017-05-09 18:00 被阅读2448次

    1、项目需求:

    一个cell上的UITextView。多行显示,有属性字符串,可以点击链接跳转。但需要禁止文本选择和禁用系统自带的复制、粘贴等功能。

    2、思路分析以及网上已有案例

    1、方案一:
    UITextView禁用复制粘贴放大

    -(BOOL)textViewShouldBeginEditing:(UITextView *)textView
    {
        return NO;
    }
    

    这种方法虽可以实现禁用复制。但是,点击链接无法跳转。

    2、方案二:

    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    //    if (action == @selector(paste:))//禁止粘贴
    //        return NO;
    //    if (action == @selector(select:))// 禁止选择
    //        return NO;
    //    if (action == @selector(selectAll:))// 禁止全选
    //        return NO;
    //    return [super canPerformAction:action withSender:sender];
    UIMenuController *menuController = [UIMenuController sharedMenuController];
    if (menuController)
    {
        [UIMenuController sharedMenuController].menuVisible = NO;
    }
    return NO;
    }
    

    重写UITextView的这个方法基本,就可以截取选择文本的动作。

    但是依然有可能,出现复制的提示框。(我找了很久没有找到。所以有了下面的方案。)

    3、我的方案:

    示例代码

    #import "UITextView+DisableCopy.h"
    
    @implementation UITextView (DisableCopy)
    
    /**
      *  创建UITextField 的catgory ,将此方法粘贴到.m文件。
     *  也就是重写长按方法 ,将长按的菜单关闭掉.
     *  @return 在需要使用的类直接引入.h文件即可 无需调用
    */
    
    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    
    //一旦双击,里面禁用。取消第一响应者,设置不可交互。
    [self resignFirstResponder];
    self.userInteractionEnabled = NO;
    
    if ([UIMenuController sharedMenuController])
    {
        [UIMenuController   sharedMenuController].menuVisible = NO;
    }
    
    return NO;
    }
    
    @end
    

    建议

    [self resignFirstResponder];
    self.userInteractionEnabled = NO;
    

    小心使用。不然,可能影响事件的传递。

    参考链接:

    屏蔽UITextView 中文字选择功能的方法
    如何禁用/解除禁用 复制、剪切、选择、全选

    相关文章

      网友评论

        本文标题:UITextView 禁用文本选择+禁用复制粘贴

        本文链接:https://www.haomeiwen.com/subject/yqjitxtx.html