博客> iOS复制功能
iOS复制功能
2017-10-19 19:48 评论:0 阅读:291 zyqiong
ios 复制

1.UITableView相应的代理方法: // 长按时出现“剪切、复制、粘贴”menu

   - (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath {

            return YES;
    }

// 长按之后弹出的menu中都包含那几个功能 (copy: / cut: / paste:)

- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {

    if (action == @selector(copy:)) {  // 只包含拷贝功能

        return YES;

    }

    return NO;
}

// 拷贝相应的内容到剪切板

     - (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {

    if (action == @selector(copy:)) {

        NSString *str = self.dataSource[indexPath.row];

        [UIPasteboard generalPasteboard].string = str;

    }
}

2.UITableView也可以自定义

原理是在定义cell的时候给cell添加长按手势,在手势的响应事件中实现对应的功能。这么做不仅可以实现复制粘贴等系统功能,还可以实现其他自定义功能。比如QQ中的“收藏”、“删除”、“更多...”

1>在cellForRowAtIndexPath方法中给cell添加长按手势

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"mycellindex"];

    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"mycellindex"];

    }

    cell.textLabel.text = self.dataSource[indexPath.row];

    UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(cellLongPress:)];

    [cell addGestureRecognizer:gesture];

    return cell;
}

2> 实现响应方法

- (void)cellLongPress:(UILongPressGestureRecognizer *)gesture {

        // 因为一个手势要经历UIGestureRecognizerStateBegan、UIGestureRecognizerStateChanged、UIGestureRecognizerStateEnded等多个状态,所以这个方法会执行多次。

    // 一般只需要在began的时候执行动作,所以需要添加这个if判断

    if (gesture.state == UIGestureRecognizerStateBegan) {

        NSLog(@"触发了长按手势");

        // 创建弹出的menu

        UIMenuController *menuController = [UIMenuController sharedMenuController];

        // 弹出的menu都有哪几个item

        UIMenuItem *item = [[UIMenuItem alloc] initWithTitle:@"复制" action:@selector(copyAction)];

        UIMenuItem *item1 = [[UIMenuItem alloc] initWithTitle:@"自定义" action:@selector(selAction)];

        // 设置item

        menuController.menuItems = @[item,item1];

        [menuController setTargetRect:gesture.view.frame inView:gesture.view.superview];

        // 设置menu可见,因为默认是不可见的

        [menuController setMenuVisible:YES animated:YES];

        [UIMenuController sharedMenuController].menuItems = nil;

        // 获取需要获取的文本

        CGPoint point = [gesture locationInView:self.myTable];

        NSIndexPath *indexPath = [self.myTable indexPathForRowAtPoint:point];

        self.needCopyStr = self.dataSource[indexPath.row];

        NSLog(@"需要复制的文本:%@",self.needCopyStr);

    }
}

3>实现功能

- (void)selAction {

    NSLog(@"点击了自定义,实现自定义功能");
}

- (void)copyAction {

    NSLog(@"点击了复制,实现复制功能");

    // 复制到剪切板

    [UIPasteboard generalPasteboard].string = self.needCopyStr;
}

4>要实现这个方法

- (BOOL)canBecomeFirstResponder {

    return YES;

}

5>有选择地显示menu中的选项

// 下面代码表示只有“复制”选项可以显示

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {

    if (action == @selector(copyAction)) {

        return YES;

    }

    return NO;

}

3.其他可以响应事件的控件

例如UILable、UIView、UIImageVIew都可以用上述自定义方法来实现长按复制等功能

收藏
0
sina weixin mail 回到顶部