UILabel默认是不响应Touch事件的,也无法复制,那么我们就需要自己实现一个可复制的。
以实现可复制的UILabel为例:
方法一:
实现步骤:
1、自定义一个类继承自UILabel
2、让label可以接收到事件,也就是成为第一响应者。即实现-(BOOL)canBecomeFirstResponder;
3、实现-(BOOL)canPerformAction:(SEL)action withSender:(id)sender,放出你需要的功能,比如你要放出copy,你就返回YES,否则返回NO;
4、给label添加touch事件,label默认是不接收事件的。可以添加长按手势等
5、创建弹出菜单UIMenuItem、UIMenuController,并将UIMenuItem添加到UIMenuController上。
6、实现UIMenuItem的相关方法,在相关方法中创建剪切板UIPasteboard(可直接使用系统的,也可自定义)。
7、至此完成收工。
附上代码:
//为了能接收到事件(能成为第一响应者)
-(BOOL)canBecomeFirstResponder {
return YES;
}
// 可以响应的方法
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender {
return (action == @selector(copy:));
}
//针对于响应方法的实现
-(void)copy:(id)sender {
UIPasteboard *pboard = [UIPasteboard generalPasteboard];
pboard.string = self.text;
}
//UILabel默认是不接收事件的,我们需要自己添加touch事件
-(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];
UIMenuItem *copyLink = [[UIMenuItem alloc] initWithTitle:@"复制"
action:@selector(copy:)];
CGPoint location = [recognizer locationInView:[recognizer view]];
CGRect menuLocation = CGRectMake(location.x, location.y, 0, 0);
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:copyLink, nil]];
[[UIMenuController sharedMenuController] setTargetRect:menuLocation inView:[recognizer view]];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated: YES];
}
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender;包含的功能有:copy,paste,cut,select,selectAll,delete等,需要实现什么方法在此方法中返回即可。如下
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
return (action == @selector(copy:) || action ==@selector(paste:) || action ==@selector(cut:) || action ==@selector(select:) || action ==@selector(delete:));
}
方法二:
如果label只是实现一个复制功能,我们也可以直接使用UITextView,创建一个对象,禁止它编辑,即[TextView setEditable:NO];即可。如果想过滤一下弹框的选项,那就自定义,重新实现-(BOOL)canPerformAction:(SEL)action withSender:(id)sender;好喽。
实现步骤:
1、自定义一个类继承自UITextView
2、将UITextView设置为不可编辑:[self setEditable:NO];
3、直接实现:-(BOOL)canPerformAction:(SEL)action withSender:(id)sender;去掉不需要的
//* 选中文字后的菜单响应的选项 */
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (action == @selector(copy:) || action == @selector(selectAll:)) { // 菜单不能响应copy项或菜单不能响应select all项
return YES;
}
return NO;
}
4、至此完成收工。是不是更简单
备注:因为UITextView直接就可以称为第一响应者,所以不需要实现- (BOOL)canBecameFirstResponder;方法
PS:希望对您有点帮助,也可以加我QQ好友(1224740397),很乐意与您分享,共同学习。
Life is a sail trip full of chances and challenges.
人生的航行充满了机遇与挑战。