iOS粘贴板的实现

本文介绍了如何在iOS中实现长按复制图片上的固定内容,主要涉及UIPasteboard、UIMenuController和UIResponder的使用。通过给UILabel添加手势识别和自定义事件,结合系统提供的UIPasteboard,实现用户长按复制文本的功能。

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

今天由于某些原因,要改动一些页面,以前设计好的一些页面暂时不再使用,要求新加一个用户长按复制图片上内容(固定)的功能,因此才会有这篇文章。

今天的主角:UIPasteboard

UIPasteboard

UIPasteboard一般不会单独使用,一般都是配合UIMenuControllerGesture一起使用.比如用户在label的文本上长按,复制label的内容等等
所以,我们要先了解他们。

UIMenuController

就是一个view上出现的菜单栏,熟悉iOS的用户一般都会知道,textfield,textview,webview.都会有这个功能,系统已经默认为他们实现了相关功能。

今天我们来给一个label添加菜单

UIResponder

当然,这个也是一个不可不说的元素。
如果我们想给label添加手势。那么首先要打开控件的用户交互。

    //下面来回顾一下 想要实现MenuController 和 UIPasteboard 需要什么流程
    //1 需要打开用户交互
    self.userInteractionEnabled = YES;

    //2.添加长按手势
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressAction)];
    [self addGestureRecognizer:longPress];
- (void)longPressAction {
    //使本身能够成为第一响应者  //必须要实现,不然MenuController不能显示
    [self becomeFirstResponder];

    //创建MenuController ,单例
    UIMenuController *menuController = [UIMenuController sharedMenuController];
    //要显示的内容,每一个都是UIMenuItem
    UIMenuItem *copyItem = [[UIMenuItem alloc]initWithTitle:@"复制" action:@selector(copyAction)];

    UIMenuItem *deleteItem = [[UIMenuItem alloc]initWithTitle:@"删除(仅LOG测试)" action:@selector(deleteAction)];
    //设置要显示的内容,为数组
    menuController.menuItems = @[copyItem,deleteItem];

    //设置frame和显示到哪里 第一个参数:frame, 第二个,显示到哪里
    [menuController setTargetRect:self.frame inView:[self superview]];
    //设置箭头的方向
    menuController.arrowDirection = UIMenuControllerArrowRight;
    //是这个Menu显现出来
    menuController.menuVisible = YES;

}

当然,有几个必须实现的方法

#pragma mark -

//override 父类的方法, 使该label可以成为第一响应者
//该方法必须实现。
- (BOOL)canBecomeFirstResponder {
    return YES;
}

//该方法必须实现。
/*
 UIResponder — Responders implement the canPerformAction:withSender: to enable or disable commands in the above-mentioned menu based on the current context.
 */

//可以在该方法里判断是否能传递实现方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    if (action == @selector(copyAction) || action == @selector(deleteAction)) {
        return YES;
    }
    return NO;
}

然后就是自定义的事件了

#pragma mark - Event response
- (void)copyAction {
    //复制操作

    //单例 创建 粘贴板
    UIPasteboard *paste = [UIPasteboard generalPasteboard];
    paste.string = self.text;

}

- (void)deleteAction {
    //删除操作

    NSLog(@"删除按钮点击了");
}

如果我们是自己写了一个新的类WDPasteLabel,那么,我们就要在初始化的时候把点击手势添加进去

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self setUpMenuController];
    }
    return self;
}

- (void)awakeFromNib {
    [super awakeFromNib];

    [self setUpMenuController];
}

当然
这里有个小demo
大家可以下载下来运行一下看看效果,里边注释很详细

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值