类似于 QQ长按弹出菜单视图 (主要是文字的复制、粘贴)

本文介绍了如何在iOS应用中实现长按手势触发的菜单,菜单包含复制、粘贴和删除操作。通过创建UIMenuController,设置菜单项并关联相应的方法来处理用户选择。此外,还实现了成为第一响应者和处理动作的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//长按触发的事件
- (void)longAction:(UILongPressGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"长按手势已经触发");
        //一定要调用这个方法
        [self becomeFirstResponder];
        //创建菜单控制器
        UIMenuController * menuvc = [UIMenuController sharedMenuController];
        UIMenuItem * menuItem1 = [[UIMenuItem alloc]initWithTitle:@"复制" action:@selector(firstItemAction:)];
        UIMenuItem * menuItem2 = [[UIMenuItem alloc]initWithTitle:@"粘贴" action:@selector(secondItemAction:)];
        UIMenuItem * menuItem3 = [[UIMenuItem alloc]initWithTitle:@"删除" action:@selector(threeItemAction:)];
        menuvc.menuItems = @[menuItem1, menuItem2, menuItem3];
        [menuvc setTargetRect:CGRectMake(self.bounds.size.width/2, self.bounds.origin.y-5, 0, 0) inView:self];
        [menuvc setMenuVisible:YES animated:YES];
    }
}
#pragma mark--设置每一个item的点击事件
- (void)firstItemAction:(UIMenuItem *)item
{
    NSLog(@"%s--->%@", __func__, item);
    //通过系统的粘贴板,记录下需要传递的数据
    [UIPasteboard generalPasteboard].string = @"我们好像在见过";
}
- (void)secondItemAction:(UIMenuItem *)item
{
    NSLog(@"%s--->%@", __func__, item);
    //从系统的粘贴板获取复制的数据
    NSString * str = [UIPasteboard generalPasteboard].string;
    if (str) {
        self.text = str;
    }
}
- (void)threeItemAction:(UIMenuItem *)item
{
    NSLog(@"%s--->%@", __func__, item);
    self.text = nil;
}
#pragma mark--必须实现的关键方法
//自己能否成为第一响应者
- (BOOL)canBecomeFirstResponder
{
    return YES;
}
//能否处理Action事件
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(firstItemAction:) || action == @selector(secondItemAction:) ) {
        return YES;
    }
    return [super canPerformAction:action withSender:sender];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值