iOS UIPasteboard的应用
前段时间偶然看到了天猫客户端有一个很贴心的功能,就是领取红包的时候,只要复制了一段特定信息,然后打开天猫的客户端,就会提醒你去领红包,如下图。
虽然功能很简单,但是确实很贴心的为用户考虑。
整个功能的原理其实很简单的,就是使用了iOS剪切板UIPasteboard
。下面我们来细看一下这个类,来实现天猫客户端的这个功能。
可以看出创建UIPasteboard
实例有三个类方法:
+ (UIPasteboard *)generalPasteboard;
这个方法是获取通用的剪切板实例,就是所有的应用程序都可以访问的;+ (UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName create:(BOOL)create;
这个方法是通过’pasteboardName’获取剪切板,如果没有我们可以指定是否创建;+ (UIPasteboard *)pasteboardWithUniqueName;
创建一个唯一的剪切板,有系统命名的,名字我们可以通过pasteboard.name
来获取。
如果要实现天猫这样的功能,我们使用只能使用+ (UIPasteboard *)generalPasteboard;
来获取剪切板实例。我们可以在AppDelegate.m
中的- (void)applicationDidBecomeActive:(UIApplication *)application
方法中加入获取剪切板内容的代码,如下:
1 | UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; |
好了 这个功能就完成了,就是这么简单,看一下效果:
扩展
iOS系统中,UITextField
、UITextView
和UIWebView
默认是可以使用剪切板的,如果其他的UI控件使用剪切板的话,就需要自己处理了,下面我们给UILabel
和UIImageView
添加剪切板。
首先我们创建一个继承UILabel
的子类LBCopyPasteLabel
,使用剪切板我们需要把userInteractionEnabled
设置为YES
,然后需要设置视图可以成为第一响应者,如下代码:1
2
3- (BOOL)canBecomeFirstResponder {
return YES;
}
然后在UIPasteboard
中只使用Copy
和Paste
功能,代码如下:
1 | -(BOOL)canPerformAction:(SEL)action withSender:(id)sender { |
接着实现- (void)copy:(id)sender
和- (void)paste:(id)sender
方法,
具体实现如下:
1 | - (void)copy:(id)sender { |
最后我们可以在label
中添加一个UIPanGestureRecognizer
长按的手势,本文中使用的是在- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
这个方法中操作的,所以就没有添加长按的手势,我们看一下具体的实现代码:
1 | - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { |
OK,这样就实现了一个可以Copy
和Paste
的UILabel
,实现可以复制和剪切的UIImageView
,原理也是一样的,只是实现- (void)copy:(id)sender
和- (void)paste:(id)sender
稍微不一样,如下:
1 | - (void)copy:(id)sender { |
好了,这样就完成了,具体的效果如下图,本文Demo