UIlabel复制

<p>   关于UILabel的扩展网上有很多优秀的框架,个人平常在用的基本就是TTTAttributedLabel,对于一般的文本操作(例如设置行间距等)而言,个人感觉TTTAttributedLabel够用了,如果是再复杂点的富文本,可以参考MLEmojiLabel或MLLabel,这两个扩展UILabel是同一个作者,继承自TTTAttributedLabel,可以区分网址,邮箱,电话号码等特殊文本内容,并提供了对应的代理方法,可以根据个人需要对这些特殊文本内容进行操作,例如打开网址,拨打电话,发送邮箱等。</p><p>   不过这些扩展的UILabel都没有长按复制的功能,不知道为什么,可能是太简单了吧,也可能是有其他方便的方法,不过我在网上找资料的时候只找到了下面这种方法,同样是继承自UILabel的。</p><p>   首先,新建一个Cocoa Class,Subclass of选择UILabel,点击完成。</p><p>   然后开始操作.m文件,首先UILabel默认是不接收事件的,所以在初始化的时候先添加所需的touch事件,这里我用的是长按。具体代码如下:</p><p>
<pre name="code" class="objc">//初始化时绑定事件 使之可以接收事件
- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self attachTapHandler];
    }
    return self;
}
<pre name="code" class="objc">- (void)awakeFromNib {
    [super awakeFromNib];
    [self attachTapHandler];
}
//设置UILabel可以成为第一响应者
<pre name="code" class="objc">- (BOOL)canBecomeFirstResponder {
    return YES;
}
 //UILabel默认是不接收事件的,我们需要自己添加touch事件- (void)attachTapHandler { self.userInteractionEnabled = YES; //用户交互的总开关 UILongPressGestureRecognizer *touch = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longTap:)]; touch.minimumPressDuration = 0.5; //这里可以理解为响应启动的最小长按时间,尝试后感觉0.5秒效果不错 [self addGestureRecognizer:touch];} 
 

接着去实现长按启动的方法,代码如下:


//我们已经可以接收到事件了 接下来,我们需要处理这个tap,以便让菜单栏弹出来:
- (void)longTap:(UIGestureRecognizer*) recognizer {
    //长按事件响应成功
    if(recognizer.state == UIGestureRecognizerStateBegan) {
        self.backgroundColor = [UIColor lightGrayColor]; //设置选中时颜色 这里仿微信
        [self becomeFirstResponder];
        UIMenuItem *copyLink = [[UIMenuItem alloc]  initWithTitle:@"复制" action:@selector(mycopy:)];
        [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:copyLink, nil]];
        [[UIMenuController sharedMenuController] setTargetRect:self.frame inView:self.superview];
        [[UIMenuController sharedMenuController] setMenuVisible:YES animated: YES];
    }
    送手后去掉选中时的颜色
    if (recognizer.state == UIGestureRecognizerStateEnded) {
        self.backgroundColor = [UIColor clearColor];
    }
}
    
   最后,利用系统的粘贴板进行功能的实现。
<pre name="code" class="objc">
//可以响应的方法 这里只响应复制
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    [super canPerformAction:action withSender:sender];
    if (action == @selector(mycopy:)) {
        return YES;
    } else {
        return NO;
    }
}

//针对于响应方法实现复制功能 将复制的内容赋值给<span style="font-family: Arial, Helvetica, sans-serif;">UIPasteboard,就可以在编辑框中进行粘贴了</span>
- (void)mycopy:(id)sender {
    UIPasteboard *pboard = [UIPasteboard generalPasteboard];
    pboard.string = self.text;
}

   以上为个人观点,如果有错误的地方,请指正。

 


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值