博客> UILabel 实现长按复制功能
UILabel 实现长按复制功能
2017-12-11 17:45 评论:1 阅读:497 tianya2416
UIlabel 剪切板 长按复制

1、前言

上一篇介绍了iOS剪切板如何使用,本篇就来说说如何给一个UILabel添加长按复制功能。

2、涉及到的知识点

主要有两个方面 一个是UIMenuItem另一个则是UIMenuController。

3、代码实现

//添加一个长按响应方法
- (void)addLongPressGestureRecognizer
{
    UILongPressGestureRecognizer * longPress = [[UILongPressGestureRecognizer alloc ]initWithTarget:self action:@selector(longPress:)];
    [self.contentLabel addGestureRecognizer:longPress];
    self.contentLabel.userInteractionEnabled = YES;
}
//长按方法的实现
- (void)longPress:(UILongPressGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateBegan)
    {
        [self becomeFirstResponder];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuItemsHiden) name:UIMenuControllerWillHideMenuNotification object:nil];
        UIMenuItem *copy = [[UIMenuItem alloc]initWithTitle:@"复制" action:@selector(menuCopy:)];
        UIMenuItem * report = [[UIMenuItem alloc]initWithTitle:@"举报" action:@selector(menuReport:)];
        UIMenuController *menu = [UIMenuController sharedMenuController];
        [menu setMenuItems:@[copy,report]];
        [menu setTargetRect:CGRectMake([sender locationInView:self.view].x, [sender locationInView:self.view].y, 0, 0) inView:self.view];
        [menu setMenuVisible:YES animated:YES];
        self.contentLabel.backgroundColor = [UIColor grayColor];

    }
}
/*!
 *  允许成为第一响应
 */
- (BOOL)canBecomeFirstResponder{
    return YES;
}
/*!
 *  用于控制哪些命令显示在编辑菜单中
 */
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
    if (action == @selector(menuCopy:)) {
        return YES;
    }
    if (action == @selector(menuReport:)) {
        return YES;
    }
    return NO;
}
/**
 *  @brief 复制的响应方法
 *
 *  @param sender
 */
-(void)menuCopy:(id)sender
{
    [UIPasteboard generalPasteboard].string = self.contentLabel.text?self.contentLabel.text:@"";
}
/**
 *  @brief 举报的响应方法
 *
 *  @param sender
 */
-(void)menuReport:(id)sender
{
    //跳转到举报用户添加 举报类型字段
    NSLog(@"举报的响应方法");
}

- (void)menuItemsHiden
{
    self.contentLabel.backgroundColor = [UIColor whiteColor];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

代码比较简单有些人对UIMenuControllerWillHideMenuNotification这个通知无法理解,其实这个通知主要是当复制按钮这个控件消失的时候,需要把这个UILabel颜色还原。望大家一起学习

收藏
0
sina weixin mail 回到顶部