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;
小心使用。不然,可能影响事件的传递。