一、自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField、UITextView与UIWebView。在这些控件的文字交互处进行长按手势可以在屏幕视图上唤出系统的剪切板控件,用户可以进行复制、粘贴,剪切等操作,其效果分别如下图所示。

UITextField的文字操作

UITextView的文字操作

二、系统的剪切板管理类UIPasteboard

实际上,当用户通过上面的空间进行复制、剪切等操作时,被选中的内容会被存放到系统的剪切板中,并且这个剪切板并不只能存放字符串数据,其还可以进行图片数据与网址URL数据的存放。这个剪切板就是UIPasteboard类,开发者也可以直接通过它来操作数据进行应用内或应用间传值。

UIPasteboard类有3个初始化方法,如下:

//获取系统级别的剪切板

+ (UIPasteboard *)generalPasteboard;

//获取一个自定义的剪切板 name参数为此剪切板的名称 create参数用于设置当这个剪切板不存在时 是否进行创建

+ (nullable UIPasteboard *)pasteboardWithName:(NSString *)pasteboardName create:(BOOL)create;

//获取一个应用内可用的剪切板

+ (UIPasteboard *)pasteboardWithUniqueName;

上面3个初始化方法,分别获取或创建3个级别不同的剪切板,系统级别的剪切板在整个设备中共享,即是应用程序被删掉,其向系统级的剪切板中写入的数据依然在。自定义的剪切板通过一个特定的名称字符串进行创建,它在应用程序内或者同一开发者开发的其他应用程序中可以进行数据共享。第3个方法创建的剪切板等价为使用第2个方法创建的剪切板,只是其名称字符串为nil,它通常用于当前应用内部。

注意:使用第3个方法创建的剪切板默认是不进行数据持久化的,及当应用程序退出后,剪切板中内容将别抹去。若要实现持久化,需要设置persistent属性为YES。

UIPasteboard中常用方法及属性如下:

//剪切板的名称

@property(readonly,nonatomic) NSString *name;

//根据名称删除一个剪切板

+ (void)removePasteboardWithName:(NSString *)pasteboardName;

//是否进行持久化

@property(getter=isPersistent,nonatomic) BOOL persistent;

//此剪切板的改变次数 系统级别的剪切板只有当设备重新启动时 这个值才会清零

@property(readonly,nonatomic) NSInteger changeCount;

下面这些方法用于设置与获取剪切板中的数据:

最新一组数据对象的存取:

//获取剪切板中最新数据的类型

- (NSArray *)pasteboardTypes;

//获取剪切板中最新数据对象是否包含某一类型的数据

- (BOOL)containsPasteboardTypes:(NSArray *)pasteboardTypes;

//将剪切板中最新数据对象某一类型的数据取出

- (nullable NSData *)dataForPasteboardType:(NSString *)pasteboardType;

//将剪切板中最新数据对象某一类型的值取出

- (nullable id)valueForPasteboardType:(NSString *)pasteboardType;

//为剪切板中最新数据对应的某一数据类型设置值

- (void)setValue:(id)value forPasteboardType:(NSString *)pasteboardType;

//为剪切板中最新数据对应的某一数据类型设置数据

- (void)setData:(NSData *)data forPasteboardType:(NSString *)pasteboardType;

多组数据对象的存取:

//数据组数

@property(readonly,nonatomic) NSInteger numberOfItems;

//获取一组数据对象包含的数据类型

- (nullable NSArray *)pasteboardTypesForItemSet:(nullable NSIndexSet*)itemSet;

//获取一组数据对象中是否包含某些数据类型

- (BOOL)containsPasteboardTypes:(NSArray *)pasteboardTypes inItemSet:(nullable NSIndexSet *)itemSet;

//根据数据类型获取一组数据对象

- (nullable NSIndexSet *)itemSetWithPasteboardTypes:(NSArray *)pasteboardTypes;

//根据数据类型获取一组数据的值

- (nullable NSArray *)valuesForPasteboardType:(NSString *)pasteboardType inItemSet:(nullable NSIndexSet *)itemSet;

//根据数据类型获取一组数据的NSData数据

- (nullable NSArray *)dataForPasteboardType:(NSString *)pasteboardType inItemSet:(nullable NSIndexSet *)itemSet;

//所有数据对象

@property(nonatomic,copy) NSArray *items;

//添加一组数据对象

- (void)addItems:(NSArray *> *)items;

上面方法中很多需要传入数据类型参数,这些参数是系统定义好的一些字符窜,如下:

//所有字符串类型数据的类型定义字符串数组

UIKIT_EXTERN NSArray *UIPasteboardTypeListString;

//所有URL类型数据的类型定义字符串数组

UIKIT_EXTERN NSArray *UIPasteboardTypeListURL;

//所有图片数据的类型定义字符串数据

UIKIT_EXTERN NSArray *UIPasteboardTypeListImage;

//所有颜色数据的类型定义字符串数组

UIKIT_EXTERN NSArray *UIPasteboardTypeListColor;

相比于上面两组方法,下面这些方法更加面向对象,在开发中使用更加方便与快捷:

//获取或设置剪切板中的字符串数据

@property(nullable,nonatomic,copy) NSString *string;

//获取或设置剪切板中的字符串数组

@property(nullable,nonatomic,copy) NSArray *strings;

//获取或设置剪切板中的URL数据

@property(nullable,nonatomic,copy) NSURL *URL;

//获取或设置剪切板中的URL数组

@property(nullable,nonatomic,copy) NSArray *URLs;

//获取或s何止剪切板中的图片数据

@property(nullable,nonatomic,copy) UIImage *image;

//获取或设置剪切板中的图片数组

@property(nullable,nonatomic,copy) NSArray *images;

//获取或设置剪切板中的颜色数据

@property(nullable,nonatomic,copy) UIColor *color;

//获取或设置剪切板中的颜色数组

@property(nullable,nonatomic,copy) NSArray *colors;

对剪切板的某些操作会触发如下通知:

//剪切板内容发生变化时发送的通知

UIKIT_EXTERN NSString *const UIPasteboardChangedNotification;

//剪切板数据类型键值增加时发送的通知

UIKIT_EXTERN NSString *const UIPasteboardChangedTypesAddedKey;

//剪切板数据类型键值移除时发送的通知

UIKIT_EXTERN NSString *const UIPasteboardChangedTypesRemovedKey;

//剪切板被删除时发送的通知

UIKIT_EXTERN NSString *const UIPasteboardRemovedNotification;

三、复制图片的简单例子创建一个CopyView

#import "CopyView.h"

@interface CopyView ()

@property (strong, nonatomic) UIImageView* img1;

@property (strong, nonatomic) UIImageView* img2;

@end

@implementation CopyView

-(UIImageView *)img1{

if (_img1 == nil) {

_img1 = [[UIImageView alloc] initWithFrame:CGRectMake(10.0f, 20.0f, 100.0f, 100.0f)];

NSString* path = [[NSBundle mainBundle] pathForResource:@"NetworldImage" ofType:@"jpg"];

_img1.image = [UIImage imageWithContentsOfFile:path];

}

return _img1;

}

-(UIImageView *)img2{

if (_img2 == nil) {

_img2 = [[UIImageView alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.img1.frame)+50.0f, 20.0f, 100.0f, 100.0f)];

_img2.backgroundColor = [UIColor lightGrayColor];

}

return _img2;

}

- (instancetype)initWithFrame:(CGRect)frame {

self = [super initWithFrame:frame];

if (self) {

self.backgroundColor = [UIColor whiteColor];

[self addSubview:self.img1];

[self addSubview:self.img2];

}

return self;

}

-(BOOL)canBecomeFirstResponder{

return YES;

}

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{

NSArray* methodNameArr = @[@"copy:",@"cut:",@"select:",@"selectAll:",@"paste:"];

if ([methodNameArr containsObject:NSStringFromSelector(action)]) {

return YES;

}

return [super canPerformAction:action withSender:sender];

}

-(void)copy:(id)sender{

UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];

[pasteboard setImage:self.img1.image];

}

-(void)paste:(id)sender{

UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];

self.img2.image = [pasteboard image];

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

[self becomeFirstResponder];

UIMenuController* menuController = [UIMenuController sharedMenuController];

[menuController setTargetRect:self.img1.frame inView:self];

[menuController setMenuVisible:YES animated:YES];

}

@end

在controller中

#import "ViewController.h"

#import "CopyView.h"

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

CopyView* cv = [[CopyView alloc] initWithFrame:self.view.bounds];

self.view = cv;

}

@end

效果展示

本文标题: iOS中管理剪切板的UIPasteboard粘贴板类用法详解

本文地址: http://www.cppcns.com/ruanjian/ios/154070.html

ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解相关推荐

  1. iOS开发几年了,你清楚OC中的这些东西么!!!?

    iOS开发几年了,你清楚OC中的这些东西么!!!? 前言 几年前笔者是使用Objective-C进行iOS开发, 不过在两年前Apple发布swift的时候,就开始了swift的学习, 在swift1 ...

  2. 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解...

    salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解 建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schema ...

  3. python count函数代码_python count函数用法详解_后端开发

    fgetc函数的作用详解_后端开发 fgetc函数的作用是从指定文件读入一个字符,要求文件的打开方式必须是以读或读写的方式或者追加的方 式,只写方式是不能读的. 在python中可以使用"c ...

  4. 基于RK3399ESP8285自动售货柜项目—MP08开发板端代码详解

    基于RK3399&ESP8285自动售货柜项目-②MP08开发板端代码详解 本系列文章将详细讲解该基于RK3399及ESP8285自动售货柜的完整实现方法,从硬件连接到网络通信再到软件实现,本 ...

  5. 如何开发优秀的HTML5游戏?-迪斯尼《寻找奥兹之路》游戏技术详解(二)

    (接上文)桌面游戏通常创建于一个核心的物理引擎.因此,要在3D世界中模拟一个柔软的物体,需要一个完整的物理模拟器,并且建立一种可信的行为. WebGL和JavaScript还不能奢华到可以运行一个完全 ...

  6. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  7. python中split啥意思_python中split的用法详解_后端开发

    如何用python正则表达式匹配字符串?_后端开发 用python正则表达式匹配字符串的方法:1.当匹配单个位置的字符串时,可以使用[(.+?)]正则表达式来提取:2.当连续多个位置的字符串匹配时,可 ...

  8. java 函数fun_c语言中fun用法详解_后端开发

    Java Dao层的作用_后端开发 Dao层叫数据访问层,属于一种比较底层,比较基础的操作,可以具体到对于某个表或某个实体的增删改查,其Dao层的作用是对数据库的访问进行封装,从而不涉及业务,实现解耦 ...

  9. Pandas读取和将数据存储到多个sheet的excel以及read_excel函数常用参数详解

    Pandas读取和将数据存储到多个sheet的excel以及read_excel函数常用参数详解 Excel数据显示: read_excel函数常用参数详解 1.io 读取路径 个人比较喜欢第一种(r ...

最新文章

  1. PCL :K-d tree 2 结构理解
  2. 2020第11届蓝桥杯省赛Python题目
  3. 中国工程院发布2021中国电子信息工程科技发展十四大趋势
  4. 光电信标灯发光盘的特性电流测试
  5. Python学习之字符串格式化
  6. 新华三,定义服务器虚拟化市场新格局
  7. boost::hana::take_front_c用法的测试程序
  8. Java并发学习之六——等待线程的终结
  9. JS-Object 对象的相关方法
  10. 玩客云刷windows做服务器_精选 | 搭建一个私人服务器如何?
  11. 数据科学家令人惊叹的排序技巧
  12. java 执行class顺序_java – @BeforeClass和inheritance – 执行顺序
  13. VSCODE打开野火电机代码需要增加的配置 c_cpp_properties.json
  14. GitHub上最火的74个Android开源项目(三)
  15. 百度商桥点击咨询自定义按钮
  16. 可口可乐启示录(2):如何不带脏字的“怼”竞争对手?【姜太公公】
  17. android联动动画,Android双向列表左右联动效果
  18. Djange构建招聘信息爬虫系统
  19. VS2017无法登录:我们无法刷新此账户的凭证、我们无法添加此账户发送请求时出错、评估期已结束,请登录以解除产品锁定
  20. 关于2020年测绘资质新旧变化一览表

热门文章

  1. 比较2个DataTable中的内容是否相同的方法
  2. H5中滚动卡顿的问题
  3. lnmp之mysql原码编译
  4. Zabbix实现微信告警
  5. 31天重构学习笔记重新整理下载
  6. 推荐系列:2008年第07期 总9期
  7. 点对点信道互连以太网实验_汽车以太网 – 引领汽车IVN向多速以太网过渡
  8. java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂
  9. deepin linux 命令行_ThinkPad E480安装Manjaro-Deepin备忘录
  10. 计算机二级find,Excel函数-find、if和iferror-计算机二级Office