`
dcj3sjt126com
  • 浏览: 1888681 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IOS --关于粘贴板 ,剪切板 ,UILabel的复制

    博客分类:
  • IOS
 
阅读更多

在iOS中下面三个控件,自身就有复制-粘贴的功能:

 1、UITextView

 2、UITextField

 3、UIWebView

 

UIKit framework提供了几个类和协议方便我们在自己的应用程序中实现剪贴板的功能。

 1、UIPasteboard:我们可以向其中写入数据,也可以读取数据
 2、UIMenuController:显示一个快捷菜单,用来展示复制、剪贴、粘贴等选择的项。
 3、UIResponder中的 canPerformAction:withSender:用于控制哪些命令显示在快捷菜单中。
 4、当快捷菜单上的命令点击的时候,UIResponderStandardEditActions将会被调用。

 下面这些项能被放置到剪贴板中

 1、UIPasteboardTypeListString —   字符串数组, 包含kUTTypeUTF8PlainText
 2、UIPasteboardTypeListURL —   URL数组,包含kUTTypeURL
 3、UIPasteboardTypeListImage —   图形数组, 包含kUTTypePNG 和kUTTypeJPEG
 4、UIPasteboardTypeListColor —   颜色数组

 剪贴板的类型分为两种:
 系统级:使用UIPasteboardNameGeneralUIPasteboardNameFind,系统级应用程序关闭,或者卸载的数据不会丢失。

 应用程序级:通过设置,可以让数据在应用程序关闭之后仍然保存在剪贴板中,但是应用程序卸载之后数据就会失去。我们可用通过pasteboardWithName:create:来创建。

 

例子如下:

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

@interface UICopyLabel : UILabel  
@end  

#import "UICopyLabel.h"  
@implementation UICopyLabel  
@end  

 

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

-(BOOL)canBecomeFirstResponder
{  
    return YES;  
}  

 

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

// 可以响应的方法
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{  
    return (action == @selector(copy:));  
}  

 

 

//针对于响应方法的实现  
-(void)copy:(id)sender
{  
    UIPasteboard *pboard = [UIPasteboard generalPasteboard];  
    pboard.string = self.text;  
}  

 

有了以上三个方法,我们就能处理copy了,当然,在能接收到事件的情况下:

 

//UILabel默认是不接收事件的,我们需要自己添加touch事件  
-(void)attachTapHandler
{  
    self.userInteractionEnabled = YES;  //用户交互的总开关  
    UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];  
    touch.numberOfTapsRequired = 2;  
    [self addGestureRecognizer:touch];  
    [touch release];  
}  
//绑定事件  
- (id)initWithFrame:(CGRect)frame  
{  
    self = [super initWithFrame:frame];  
    if (self)
   {  
        [self attachTapHandler];  
    }  
    return self;  
}  
//同上  
-(void)awakeFromNib
{  
    [super awakeFromNib];  
    [self attachTapHandler];  
}  

 

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

-(void)handleTap:(UIGestureRecognizer*) recognizer
{  
 [self becomeFirstResponder];
 UIMenuItem *copyLink = [[[UIMenuItemalloc] initWithTitle:@"复制"
                                                          action:@selector(copy:)]autorelease];
 [[UIMenuControllersharedMenuController] setMenuItems:[NSArrayarrayWithObjects:copyLink, nil]];
 [[UIMenuControllersharedMenuController] setTargetRect:self.frameinView:self.superview];
 [[UIMenuControllersharedMenuController] setMenuVisible:YESanimated: YES];
}  

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

接下来我们做一个可复制的UIImageView,创建一个新的viewController,放两个imageView,默认显示不同的图:
然后把上面的代码直接拷过来,改三个地方:

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{  
    return (action == @selector(copy:) || action == @selector(paste:));  
}  
  
-(void)copy:(id)sender
{  
    UIPasteboard *pboard = [UIPasteboard generalPasteboard];  
    pboard.image = self.image;  
}  
  
-(void)paste:(id)sender
{  
    UIPasteboard *pboard = [UIPasteboard generalPasteboard];  
    self.image = pboard.image;  
}  

 UIPasteboard有系统级别和应用级别两种类型,所以不仅可以在应用程序内通信,还能在应用程序间通信,比如我复制一个url,然后打开safari,粘贴到地址栏去,而我们可以在应用程序间通信、共享数据。

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

//需要提供一个唯一的名字,一般使用倒写的域名:com.mycompany.myapp.pboard  
//后面的参数表示,如果不存在,是否创建一个  
UIPasteboard *pb = [UIPasteboard pasteboardWithName:@"testBoard" create:YES];  

使用这个粘贴板,我们可以把文本存进去,然后在另一个app里面读出来,一些常用的类型已经被设置为属性了: 


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

 

//存储数据
NSDictionary *dict = [NSDictionary dictionaryWithObject:textField.text forKey:@"content"];  
NSData *dictData = [NSKeyedArchiver archivedDataWithRootObject:dict];  
[pb setData:dictData forPasteboardType:@"myType"];  

//获取就类似于这样: 
UIPasteboard *pb = [UIPasteboard pasteboardWithName:@"testBoard" create:YES];  
NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:[pb dataForPasteboardType:@"myType"]];  
caption.text = [dict objectForKey:@"content"];  

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

code4app 现成的:http://code4app.com/ios/HTCopyableLabel/522038da6803fa987d000004

分享到:
评论

相关推荐

    ios-UILabel的简单封装.zip

    - 复制追加字符串:这个特性允许在用户复制文本后,自动在其剪贴板中追加额外的信息,如版权声明或引用来源。这对于保护内容版权或提供上下文信息很有帮助。 2. **行间距调整**: - 行间距是控制文本每一行之间...

    ios-可复制的UILabel.zip

    一.长按文字可以弹出复制菜单,点击复制可以复制文字 二.长按输入框可以弹出粘贴菜单(系统自带的),点击粘贴可以粘贴文字 三.使用的时候直接继承WLCopyLabel就可以了 四.测试环境:Xcode 6.2,iOS 6.0 以上

    ios-uilabel的内容的颜色处理.zip

    在iOS开发中,`UILabel` 是一个非常基础且重要的组件,用于展示单行或多行文本。在实际应用中,我们经常需要对`UILabel`的内容进行定制,包括改变文本颜色、字体大小、字体样式等。本教程将深入探讨如何在`UILabel`...

    ios-自适应高度UILabel.zip

    "ios-自适应高度UILabel.zip"这个压缩包文件,可能包含了关于如何在Swift中实现UILabel动态高度调整的示例代码或教程。 在这个GitHub项目"UI-Swift"中,开发者fengzhihao123分享了一种方法来解决UILabel的高度...

    ios-UILabel 根据文字计算宽高.zip

    适用于 IOS 7 之后, 做项目的时候经常需要动态的根据 label 的文字来计算 frame,每次都得写麻烦,给 label 写了个分类可以根据label 的文字来返回 label 的 CGSize.使用的时候添加 分类 即可.

    ios-自定义内边距UILabel.zip

    在iOS开发中,自定义内边距UILabel是一个常见的需求,特别是在设计复杂的用户界面时。`UILabel`是苹果提供的一个基础视图,用于显示单行或多行的文本,但默认情况下,它并不支持直接设置内边距。不过,通过一些技巧...

    ios-UILabel 的行距 间距.zip

    一句代码设置行距 间距 //设置间距 [self.label setColumnSpace:10]; //设置行距 [self.label setRowSpace:20];

    ios-UILabel显示1.n行文字.zip

    昨晚在阅读开源中国博客的时候,发现人家的cell显示1.n文字,今天在研究了一番并参考被人代码之后,将此特效做出来,供大家参考,不足之处还望大家批评指正。 链接:http://my.oschina.net/sayhellovip/blog/661372

    ios-iOS - UI - 01 - 计算器.zip

    本压缩包文件“ios-iOS - UI - 01 - 计算器.zip”显然关注的是一个基本但关键的UI组件:计算器。在iOS应用中,构建一个功能齐全、易于使用的计算器涉及多个技术点,包括Swift编程语言、UIKit框架以及人机交互设计...

    ios-UILabel类别Block扩展.zip

    UILabel类别Block扩展 包含自适应等一些用不到的小功能 建议别看 目前包含功能有: 1、block加号减号方法创建label对象 2、block加号减号方法创建自适应宽度和高度的label对象 3、block加号减号方法创建文字填充...

    ios-展开label查看更多.zip

    在iOS开发中,UI设计经常会遇到需要显示大量文本但又受限于屏幕空间的情况。在这种情况下,我们可以使用一种叫做“展开label”的技术,让文本在初始状态下显示部分内容,然后通过一个展开按钮来显示全文。这个“ios-...

    ios-label复制功能.zip

    "ios-label复制功能.zip"这个压缩包可能包含了一个示例项目或者代码库,专注于实现UILabel的复制功能。在iOS应用中,用户通常期望能够复制屏幕上的文本,如教程、文章或任何其他信息。在默认情况下,UILabel并不直接...

    ios-ExpandTableView.zip

    综上所述,“ios-ExpandTableView.zip”项目是一个关于如何在iOS应用中实现可扩展、多类型cell的UITableView示例。通过学习和理解这个项目,开发者可以掌握自定义cell、数据源和代理方法的使用,以及如何实现列表的...

    iOS UIlabel 闪烁

    在iOS开发中,UILabel是用于显示单行或多行文本的常用控件,它简洁而功能强大。然而,有时候我们可能会遇到这样一个问题:UILabel在显示文本时出现闪烁的现象,这不仅影响用户体验,也可能对应用程序的整体质量产生...

    ios-UITableView的使用.zip

    在iOS开发中,UITableView是一个非常重要的组件,它用于展示数据列表,用户可以通过滚动查看和交互。这个"ios-UITableView的使用.zip"文件很可能是包含一个示例项目,演示了如何在Swift或Objective-C中自定义...

    ios-仿酷狗歌词逐字播放效果.zip

    在iOS开发中,实现“歌词逐字播放”的特效是一项具有挑战性的任务,它涉及到多媒体处理、时间同步以及用户界面的动态更新等多个技术领域。这个压缩包文件“ios-仿酷狗歌词逐字播放效果.zip”显然是为了帮助开发者...

    ios-多选图片.zip

    在iOS中,可以使用UILabel、UIButton、UIImageView与UIStackView、UICollectionView等组合,实现灵活的图文混排效果。 通过“ImageSelectDemo”这个项目,开发者可以学习到以上各个知识点的具体实现,包括图片库...

    ios-PPCounter - 一款简单实用的数字加减动画,支持UILabel、UIButton显示.zip

    一款使用简单的数字加减动画控件,支持UILabel、UIButton显示 1.支持UILable/UIButton/自定义文本控件的数字加减动画; 2.支持一般文本属性以及富文本属性的字体显示; 3.支持四种时间曲线函数动画:由慢到快再到慢...

    ios-滑动取色板.zip

    在iOS中,我们可以使用UILabel或UIImageView来显示预览颜色,并利用UIActionSheet或UIAlertController来弹出确认对话框。 在代码实现上,我们通常会在自定义控件的.m文件中编写触摸事件处理方法,如touchesBegan:...

    swift-iOS数字滚动UILabel

    在这种情况下,"swift-iOS数字滚动UILabel"是一个实用的解决方案,它能够优雅地呈现数字变化的过程,给用户带来更生动的交互体验。这个项目的核心是自定义了一个UILabel的子类,通过动画效果模拟数字滚动的过程。 ...

Global site tag (gtag.js) - Google Analytics