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

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 禁用文本选择+禁用复制粘贴)