iOS - UIMenuController:UITextField去掉拷贝、粘贴,UILabel自定义长按拷贝

在使用微信过程中 你会发现长按消息会弹出复制、粘贴、撤回这样的选项并且带有箭头,在iOS开发中,实现这样的功能我们要用到的是UIMenuController,在iOS中,UITextField、UITextView都会有默认的UIMenuController,但是有时候我们并不希望使用这样的功能,输入框的粘贴复制往往能越过代理,导致我们不能有效的监控输入的内容,所以我们要去掉复制粘贴选项。我们需要自定义输入框。

1. 自定义一个没有复制剪贴的UITextField

1.1 创建一个类,继承自UITextField
//类名随意
@interface MJWNoCopyTextField : UITextField

@end
1.2 UIMenuController设置为不可用
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        //Initialzation code
    }
    return self;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    UIMenuController *menuController = [UIMenuController sharedMenuController];
    if (menuController) {
    //设置为不可用
        [UIMenuController sharedMenuController].menuVisible = NO;
    }
    return NO;
}
1.3 使用自定义的TextField
#pragma mark - 
#pragma mark 自定义去掉拷贝TextField
    MJWNoCopyTextField *noCopyTF = [[MJWNoCopyTextField alloc]initWithFrame:CGRectMake((self.view.frame.size.width - 250)/2, 300, 250, 35)];
    noCopyTF.backgroundColor = [UIColor whiteColor];
    noCopyTF.layer.cornerRadius = 4;
    noCopyTF.layer.masksToBounds = YES;
    noCopyTF.font = [UIFont systemFontOfSize:14];
    noCopyTF.layer.borderWidth = 1;
    noCopyTF.layer.borderColor = [[[UIColor lightGrayColor] colorWithAlphaComponent:0.4] CGColor];
    noCopyTF.placeholder = @"不能粘贴或者拷贝";
    [self.view addSubview:noCopyTF];
1.4 效果图

我们单机、双击、右击、长按,输入框都不会再弹出UIMenuController。
这里写图片描述

2. 自定义一个长按复制UILabel

在iOS中,UILabel不具备复制粘贴功能,需要我们自定义。

2.1 创建一个继承自UILabel的类
//类名请随意
@interface MJWCustomerMeauControllerLabel : UILabel

@end
2.2 其中的几个方法

//第一响应(否则不会生效)

-(BOOL)canBecomeFirstResponder {
    return YES;
}

//可响应的方法

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    return (action == @selector(copy:));
}

//响应方法

-(void)copy:(id)sender {
    /* 拷贝结束,颜色恢复 */
    self.backgroundColor = [UIColor whiteColor];
    /* 剪切板 */
    UIPasteboard *pboard = [UIPasteboard generalPasteboard];
    pboard.string = self.text;

}

//添加长按手势

-(void)attachTapHandler {
    /* 长按手势 */
    self.userInteractionEnabled = YES;
    UILongPressGestureRecognizer *touch = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    [self addGestureRecognizer:touch];
}

//绑定事件

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self attachTapHandler];
    }
    return self;
}
-(void)awakeFromNib {

    [super awakeFromNib];
    [self attachTapHandler];
}

//长按手势响应

-(void)handleTap:(UIGestureRecognizer*) recognizer {

    [self becomeFirstResponder];
    //监听
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hidden) name:UIMenuControllerWillHideMenuNotification object:nil];
    self.backgroundColor = [UIColor colorWithRed:0.231 green:0.843 blue:1.000 alpha:0.500];
    UIMenuItem *copyLink = [[UIMenuItem alloc] initWithTitle:@"复制"
                                                      action:@selector(copy:)];
    [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:copyLink, nil]];
    [[UIMenuController sharedMenuController] setTargetRect:self.frame inView:self.superview];
    [[UIMenuController sharedMenuController] setMenuVisible:YES animated: YES];
}

//消失恢复原样

- (void)hidden
{
    self.backgroundColor = [UIColor whiteColor];
}
- (void)dealloc{
    // 移除监听通知
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
2.3 效果图

这里写图片描述

该篇博文简单的说明了UIMenuController的使用方法,如有更加详尽的还望各位补充。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值