苹果剪切板,涨姿势了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

相关文章

潜艇伟伟迷杂交版植物大战僵尸2024最新免费安卓+ios苹果+iPad分享

嗨,亲爱的游戏迷们!今天我要给你们种草一个超有趣的游戏——植物大战僵尸杂交版。这款游戏不仅继承了原有经典游戏的核心玩法,还加入了许多创新元素,让玩家能够体验到前所未有的乐趣。快来跟随我一起探索这个神奇的世界吧! 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d60ed6e4791c 🔥 创新与经典的完美结合 植物大战僵尸杂交版在保持了原游戏经典玩

Android gradle打印依赖的各种姿势

查看Android Gradle 依赖树 1.查看单独模块的依赖 命令行 ./gradlew :模块名:dependencies 例子: ./gradlew :app:dependencies 这个命令会将 gradle 执行的各个步骤全打印出来,包括引用的库,和库中引用的库文件 ./gradlew :app:dependencies --configuration im

二叉树的各种遍历姿势

前言 Node节点 public static class TreeNode {TreeNode left;TreeNode right;int val;} 定义 先序遍历:先访问根,再访问左子树,最后访问右子树中序遍历:先访问左子树,再访问根,最后访问右子树后序遍历:先访问左子树,再访问右子树,最后访问根 递归式模板 public void view(TreeNode root,

Java8 Stream的各种使用姿势

Stream简介   Java 8 API添加了一个新的抽象称为流(Stream),它可以让你以一种声明的方式处理数据。这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等。 概括来说:Stream的出生就是为了代码好看、为了性能高 如何Debug   在IDEA的Debug窗口找到Trace Current Stream Ch

苹果手机safari浏览器的userAgent显示为电脑的userAgent问题解决

目录 1.问题背景 2.userAgent 3.解决 1.问题背景 开发了一个H5,是通过生成二维码,扫描这个二维码后就跳到这个H5,所以需要判断一下扫描的设备是否为手机,然后由于业务逻辑还需要判断一下手机是Android、iOS还是iPad。一般前端的做法是通过浏览器的userAgent来判断,某天有用户保障,说通过苹果手机扫描二维码后H5提示用户设备不是Android或者iP

苹果IOS系统和Mac OS系统的差别匿名

虽然Mac OS 和iOS都是基于Darwin(苹果的一个开源的系统内核,基于Unix),但这只是操作系统部分,前者只能运行在X86\X86-64构架的硬件上(过去的版本还支持PowerPC构架),而iOS只能运行在ARM构架的设备上,比如iPhone、iPod Touch、iPad和Apple TV 2/3代上。因为构架不同,二者之间完全不能通用,所以iPad上自然无法运行OSX,也不能运行基于

头歌资源库(16)分苹果

一、 问题描述  二、算法思想         首先,我们可以初始化一个数组apple来记录每个孩子分配的苹果数量,将所有元素初始化为1,表示每个孩子至少分配到一个苹果。        然后,从左到右遍历评分数组ratings,判断当前孩子的评分与前一个孩子的评分的大小关系。若当前孩子的评分大于前一个孩子的评分,则将当前孩子分配的苹果数量设为前一个孩子分配的苹果数量加1,保证相邻孩子

GPT-4o一夜被赶超,Claude 3.5一夜封王|快手可灵大模型推出图生视频功能|“纯血”鸿蒙大战苹果AI|智谱AI“钱途”黯淡|月之暗面被曝进军美国

快手可灵大模型推出图生视频功能“纯血”鸿蒙大战苹果AI,华为成败在此一举大模型低价火拼间,智谱AI“钱途”黯淡手握新“王者”,腾讯又跟渠道干上了“美食荒漠”杭州,走出一个餐饮IPOGPT-4o一夜被赶超,Anthropic推出Claude3.5,网友3分钟克隆马里奥游戏支付宝能否翻越“内容”这座山?月之暗面被曝进军美国,阿里腾讯捧出的30亿美元独角兽终于要出海了Claude3.5一夜封王,10倍编

Uniapp App 微信登录苹果登录

核心逻辑,通过第三方登录获取唯一值(openId | userId),调接口获取此唯一值对应的账号,如果未绑定跳转绑定页 微信授权返回的是一个会变的code(每次都不一致),需要调用微信相关api换取openId作为唯一值 苹果授权返回的user,可以直接作为唯一值 1 微信开放平台,移动应用>应用详情,申请开通微信登录功能,提交审核,审核通过后,进行后面步骤 2 项目内 manifes

mac苹果窗口辅助工具:Magnet for mac 2.14.0中文免激活版

Magnet 是一款针对 MacOS 系统的窗口管理工具软件。它能够帮助用户更加高效地管理和组织桌面上的窗口,通过简单的快捷键操作,可以将窗口自动调整到指定的位置和大小,实现多窗口快速布局。Magnet 还支持多显示器环境下的窗口管理,可以让用户更加轻松地在多屏幕之间切换和布局窗口。此外,Magnet 还提供了一些额外的功能,如窗口最大化、屏幕分割和调整窗口间的间距等。 下载地址:点击下载