<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;
}
以上为个人观点,如果有错误的地方,请指正。