苹果剪切板,涨姿势了UIPasteboard

2024-06-24 10:32

本文主要是介绍苹果剪切板,涨姿势了UIPasteboard,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有时候我们可能需要复制UILabel上的文本,或者UIImageView的图片,而UILabel和UIImageView默认是不响应Touch事件的,也无法复制,那么我们就需要自己实现一个可复制的UILabel。新添加一个类继承自UILabel:

[objc]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. @interface UICopyLabel : UILabel  
  2.   
  3. @end  
[objc]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. #import "UICopyLabel.h"  
  2.   
  3. @implementation UICopyLabel  
  4.   
  5. @end  

为了能接收到事件(能成为第一响应者),我们需要覆盖一个方法:

[objc]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. -(BOOL)canBecomeFirstResponder{  
  2.     return YES;  
  3. }  

还需要针对复制的操作覆盖两个方法:

[objc]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. //"反馈"关心的功能  
  2. -(BOOL)canPerformAction:(SEL)action withSender:(id)sender{  
  3.     return (action == @selector(copy:));  
  4. }  
  5. //针对于copy的实现  
  6. -(void)copy:(id)sender{  
  7.     UIPasteboard *pboard = [UIPasteboard generalPasteboard];  
  8.     pboard.string = self.text;  
  9. }  
有了以上三个方法,我们就能处理copy了,当然,在能接收到事件的情况下:
[objc]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. //UILabel默认是不接收事件的,我们需要自己添加touch事件  
  2. -(void)attachTapHandler{  
  3.     self.userInteractionEnabled = YES;  //用户交互的总开关  
  4.     UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];  
  5.     touch.numberOfTapsRequired = 2;  
  6.     [self addGestureRecognizer:touch];  
  7.     [touch release];  
  8. }  
  9. //绑定事件  
  10. - (id)initWithFrame:(CGRect)frame  
  11. {  
  12.     self = [super initWithFrame:frame];  
  13.     if (self) {  
  14.         [self attachTapHandler];  
  15.     }  
  16.     return self;  
  17. }  
  18. //同上  
  19. -(void)awakeFromNib{  
  20.     [super awakeFromNib];  
  21.     [self attachTapHandler];  
  22. }  

我们已经可以接收到事件了!由于我在上方将tap数设为2,所以需要双击才能捕获,接下来,我们需要处理这个tap,以便让菜单栏弹出来:

[objc]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. -(void)handleTap:(UIGestureRecognizer*) recognizer{  
  2.     [self becomeFirstResponder];  
  3.     UIMenuController *menu = [UIMenuController sharedMenuController];  
  4.     [menu setTargetRect:self.frame inView:self.superview];  
  5.     [menu setMenuVisible:YES animated:YES];  
  6. }  

这样一来,一个可复制的UILabel就诞生了!它能处理接收点击、弹出菜单栏、处理copy,这是一个很普通的可复制控件。

-----------------------------------------猥琐的分界线-----------------------------------------

接下来我们做一个可复制的UIImageView,创建一个新的viewController,放两个imageView,默认显示不同的图:


然后把上面的代码直接拷过来,改三个地方:

[objc]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. -(BOOL)canPerformAction:(SEL)action withSender:(id)sender{  
  2.     return (action == @selector(copy:) || action == @selector(paste:));  
  3. }  
  4.   
  5. -(void)copy:(id)sender{  
  6.     UIPasteboard *pboard = [UIPasteboard generalPasteboard];  
  7.     pboard.image = self.image;  
  8. }  
  9.   
  10. -(void)paste:(id)sender{  
  11.     UIPasteboard *pboard = [UIPasteboard generalPasteboard];  
  12.     self.image = pboard.image;  
  13. }  
-----------------------------------------猥琐的分界线-----------------------------------------
UIPasteboard不仅可以在应用程序内通信,还能在应用程序间通信,你应该已经见到过了,比如我复制一个url,然后打开safari,粘贴到地址栏去,而我们可以在应用程序间“悄悄”的通信、共享数据。

注:这里的“悄悄”只是说其他的应用程序不知道,而系统是允许的。

我们用模板Single View Application来创建两个简单的工程,一个叫PasteBoardWrite,另一个叫PasteBoardRead,界面分别如下:

     

在PasteBoardWrite里面点“写入”后把textField中的文本写入粘贴板,然后切换到PasteBoardRead的时候显示出来。如果我们的粘贴板只想给“自己人”用的话,就不能用系统的通用粘贴板,需要我们自己创建一个:

[objc]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. //需要提供一个唯一的名字,一般使用倒写的域名:com.mycompany.myapp.pboard  
  2. //后面的参数表示,如果不存在,是否创建一个  
  3. UIPasteboard *pb = [UIPasteboard pasteboardWithName:@"testBoard" create:YES];  
使用这个粘贴板,我们可以把文本存进去,然后在另一个app里面读出来,一些常用的类型已经被设置为属性了:


除此之外,如果是能够转换成plist的数据类型(NSString, NSArray, NSDictionary, NSDate, NSNumber 和 NSURL),我们可以调用setValue:forPasteboardType:方法去存储数据,其他类型只能调用setData:forPasteboardType:方法(plist数据类型也可使用),类似于这样:

[objc]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. NSDictionary *dict = [NSDictionary dictionaryWithObject:textField.text forKey:@"content"];  
  2. NSData *dictData = [NSKeyedArchiver archivedDataWithRootObject:dict];  
  3. [pb setData:dictData forPasteboardType:@"myType"];  
获取就类似于这样:

[objc]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. UIPasteboard *pb = [UIPasteboard pasteboardWithName:@"testBoard" create:YES];  
  2. NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:[pb dataForPasteboardType:@"myType"]];  
  3. caption.text = [dict objectForKey:@"content"];  

上面提到了一个PasteboardType,这是一个统一类型标识符(Uniform Type Identifier  UTI),能帮助app获取自己能处理的数据。比如你只能处理文本的粘贴,那给你一个UIImage显然是无用的。你可以使用公用的UTI,也可以使用任意字符,苹果建议使用倒写的域名加上类型名:com.myCompany.myApp.myType。

用自己创建的粘贴板,能只在你的本地应用之间通信,有时候它能让你的用户体验变得更好,比如微信就是这么做的。

UPDATED:

iOS7修改了UIPasteboard的部分设计。
这此之前,你只要知道任何一个UIPasteboard的Name,就能访问其中的内容,而现在,只有在同一CFBundleIdentifier标识下的App才能共享内容,如com.mycompany.a和com.mycompany.b,它们的com.mycompany部分是一样的,就能共享。


转载http://blog.csdn.net/zhangao0086/article/details/7580654


这篇关于苹果剪切板,涨姿势了UIPasteboard的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089892

相关文章

《黑暗之魂2:原罪学者》是什么类型的游戏 《黑暗之魂》可以在苹果Mac电脑上玩吗?

在宏大的世界观游戏中,《黑暗之魂2:原罪学者》脱颖而出,以其探索性和挑战性征服了全球玩家的心灵。下面我们来看看《黑暗之魂2:原罪学者》是什么类型的游戏,《黑暗之魂2:原罪学者》可以在苹果电脑玩吗的相关内容。 一、《黑暗之魂2:原罪学者》是什么类型的游戏 《黑暗之魂2:原罪学者》作为《黑暗之魂2》的增强版和重制版,是一款FromSoftware制作、BANDAI NAMCO和FromSoft

【C++题解】1272. 郭远摘苹果

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》 问题:1272. 郭远摘苹果 类型:二维数组 题目描述: 郭远有一天走到了一片苹果林,里面每颗树上都结有不同数目的苹果,郭远身上只能拿同一棵树上的苹果,他每到一棵果树前都会把自己身上的苹果扔掉并摘下他所在树上的苹果并带走(假设郭远会走过每一棵苹果树),问在郭远摘苹果的整个过程中,他身上携带的最多苹果数与最小苹果数的差是多少?

HDU1720(输入输出涨姿势)

A+B Coming Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5953    Accepted Submission(s): 3901 题目链接: http://acm.hdu.edu.cn/showproblem.p

硬刚苹果还得是华为

文|琥珀食酒社 作者 | 璇子 牛皮啊 华为发三折叠不意外 意外的是 这各种翻转简直颠覆想象 市面上没见过这么能“翻转”的? 要不怎么说硬刚苹果 还得看华为 就跟你同天怎么了? 拼创新、拼技术、拼热度 你就说哪比你差吧? iPhone 16做的改进 很多手机都能做,可能还早做了 但Mate XT三折叠 别人想做也做不了 不说引领时代啊 至少在折叠机领域又开

苹果账号登录后端验证两种方式 python2

import jsonimport jwt import requests import json import base64def decode_jwt(jwt_token):try:header,payload,sign = jwt_token.split('.')except:return {},{},""header = json.loads(base64.urlsafe_b6

AI超周期现状 - NVIDIA、苹果以及人工智能的整体需求

于2024年6月6日在中国杭州拍摄的英伟达和苹果的标志。到6月5日,东部时间,英伟达的市值超过3万亿美元,正式超越苹果的市值,成为全球市值第二大的科技巨头。值得注意的是,短短3个多月时间里,英伟达的市值就从2万亿美元飙升至3万亿美元。(由Costfoto摄于NurPhoto,经盖蒂图片社批准) 在九月初经历了几天的市场动荡后,又有一波关于人工智能超级周期是否已结束的讨论。如果没有结束,那接下来会

虚拟机苹果系统MacOS中XCode的安装

1、背景介绍    主机系统Win11,虚拟机VMWare17,苹果系统MacOS 13.6.7 2、Xcode的在线    点击应用市场,输入Xcode搜索: 看来Xcode无法安装在macOS V13上,直接在线安装失败。 3、采用下载安装包的方法进行安装 解决办法参考链接: 低版本Mac OS安装合适xcode的方法_不能将xcode安装在“macintosh

“苹果税”引发的苹果与腾讯、字节跳动之间的纷争与博弈

北京时间9月10日凌晨一点的Apple特别活动日渐临近,苹果这次将会带来iPhone16系列新品手机及其他硬件产品的更新,包括iPad、Apple Watch、AirPods等。从特别活动的宣传图和宣传标语“閃亮時刻”来看,Apple Intelligence将会是史上首次推出,无疑将会是iOS 18的重头戏和高光时刻。 不过就在9月2日,一则“微信可能不支持iPhone16”的

苹果发布/分发 应用文档

苹果发布/分发 应用文档 1.发布证书 发布证书相关说明可以看这篇详细的文档:证书相关 2.打包应用 1.X-code设置 (1)code signing identity -> iOS Developer (必须) (2 ) Edit Scheme -> release (可选)发布到App Store 或者需要发布版本测试时(比如推送正式环境测试)需要修改 2.打包

苹果证书说明文档

苹果证书说明文档 苹果的证书,描述文件等经常会造成一些开发者的困扰,所以写一篇详(sha)细(gua)版文档来做一个说明. 1.证书介绍 1.Certification 证书 证书是用来给测试或者发布的权限的凭证,宏观上分为以下两种 (1)Developer Certification(开发证书) 安装在电脑上提供权限:开发人员通过设备进行真机测试。 可以生成副本供多台电脑安