今天由于某些原因,要改动一些页面,以前设计好的一些页面暂时不再使用,要求新加一个用户长按复制图片上内容(固定)的功能,因此才会有这篇文章。
今天的主角:UIPasteboard
UIPasteboard
UIPasteboard
一般不会单独使用,一般都是配合UIMenuController
和Gesture
一起使用.比如用户在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
大家可以下载下来运行一下看看效果,里边注释很详细