经查询,系统中支持复制功能的控件有如下3种:UITextView,UITextField,UIWebView
所以要想用UILabel支持复制功能,如下图所示,则需要自定义
一,添加一个label的类别
//.h
#import <UIKit/UIKit.h>
@interface UILabel (Copy)
@property (nonatomic,assign) BOOL isCopyable;
@end
//.m
#import "UILabel+Copy.h"
@implementation UILabel (Copy)
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
return (action == @selector(copyText:));
}
- (void)attachTapHandler {
// 使UILabel成为第一响应者
self.userInteractionEnabled = YES;
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self addGestureRecognizer:longPress];
}
// 处理手势相应事件
- (void)handleTap:(UIGestureRecognizer *)longPress {
[self becomeFirstResponder];
//UIMenuController的要求,要显示UIMenuController对象的UIView必须是当前UIWindow的第一响应者
UIMenuItem *item = [[UIMenuItem alloc] initWithTitle:@"复制" action:@selector(copyText:)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:item]];
[[UIMenuController sharedMenuController] setTargetRect:CGRectMake(self.width/3+self.left, self.top+17, 100, 20) inView:self.superview];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
}
// 复制时执行的方法
- (void)copyText:(id)sender {
//系统的粘贴板UIPasteboard
UIPasteboard *pBoard = [UIPasteboard generalPasteboard];
// 有些时候只想取UILabel的text中的一部分
if (objc_getAssociatedObject(self, @"expectedText")) {
pBoard.string = objc_getAssociatedObject(self, @"expectedText");
} else {
// 因为有时候 label 中设置的是attributedText,而 UIPasteboard 的string只能接受 NSString 类型,所以要做相应的判断
if (self.text) {
pBoard.string = self.text;
} else {
pBoard.string = self.attributedText.string;
}
}
}
- (BOOL)canBecomeFirstResponder {
return [objc_getAssociatedObject(self, @selector(isCopyable)) boolValue];
}
- (void)setIsCopyable:(BOOL)number {
objc_setAssociatedObject(self, @selector(isCopyable), [NSNumber numberWithBool:number], OBJC_ASSOCIATION_ASSIGN);
[self attachTapHandler];
}
- (BOOL)isCopyable {
return [objc_getAssociatedObject(self, @selector(isCopyable)) boolValue];
}
二,方法的调用
_detilLab.isCopyable=YES;