大数据

UILabel 的复制

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.
人生的航行充满了机遇与挑战。