iOS UILabel复制粘贴效果

来源:互联网 发布:西安网络优化公司排名 编辑:程序博客网 时间:2024/06/05 20:39

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

 1UITextView

 2UITextField

 3UIWebView


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

 1UIPasteboard:我们可以向其中写入数据,也可以读取数据。UIPasteboard类提供了粘贴板的接口。粘贴板是用于在一个应用程序内或不同应用程序间进行数据共享的受保护区域。该类提供了读写剪贴板上数据项目的方法。
 2UIMenuController:显示一个快捷菜单,用来展示复制、剪贴、粘贴等选择的项。
 3UIResponder中的 canPerformAction:withSender:用于控制哪些命令显示在快捷菜单中。

1.uimenucontroller的使用
1. Menu所处的View必须实现 – (BOOL)canBecomeFirstResponder, 且返回YES
   -使view或者viewController的self成为第一响应者,可以在相应文件的任意地方调用实现该方法,不过建议与UIMenuController放在一起。

[self becomeFirstResponder];
2. Menu所处的View必须实现 – (BOOL)canPerformAction:withSender, 并根据需求返回YES或NO
     重载函数-(BOOL) canPerfomAction:(SEL)action withSender:(id)sender,设置要显示的菜单项,返回值为YES。若不进行任何限制,则将显示系统自带的所有菜单项(很多的,自己可以 试一下),在此,只显示自定义的4项,即:
3. 使Menu所处的View成为First Responder (becomeFirstResponder)
4. 定位Menu (- setTargetRect:inView:)
5. 展示Menu (- setMenuVisible:animated:)

http://blog.163.com/fengyi1103@126/blog/static/1383562742010418102311531/
复制粘贴API的使用和注意事项
首先要了解的是UIMenuController,也就是复制粘贴Menu Controller;它用来控制使用复制粘贴的时候弹出的按钮。这个控制器在整个系统中只有一个实例,而且,应该显示哪个按钮就是由它来决定的。
在系统发现在其他View里有Touch事件的时候,会自动将复制粘贴菜单隐藏。另外,有告警对话框弹出或者软件退出的时候,复制按钮也会被隐藏。当然,还是通过-setMenuVisible:animated:方法,或者对UIMenuController.menuVisible进行赋值将其隐藏,也可以手动将其隐藏。
剪切版
通过+generalPasteboard 方法可以得到系统剪切板,通过+pasteboardWithName:create: 可以创建自己的剪贴板,而通过+pasteboardWithUniqueName可以根据名字找到相应的自建剪贴板。
设置剪贴板的persistent属性可以使自建剪贴板的数据在程序退出后仍然保持。
这些数据在这个程序被删除的时候会被清空,但是苹果公司建议不要将这个作为应用软件数据持久性的方案,因为不能保证在重启之后这些数据还能存在。剪贴板的所有者可以用+removePasteboardWithName:方法来注销一个自建的剪贴板。

 NSStringNSArrayNSDictionaryNSDateNSNumberNSURLUIImage, or NSData object. 
To put objects—such as NSStringNSArrayNSDictionaryNSDateNSNumberUIImage, or NSURL objects—on the pasteboard, use the setValue:forPasteboardType: method.

//代码 一,
//- 使用系统自带的copy,paste,cut,delete(这些事UIResponder的方法)等功能
////  UICopyLabel.m//  PastePractice#import "UICopyLabel.h"@interface UICopyLabel ()@property (nonatomic, strong)UIPasteboard *pasteBoard;@end@implementation UICopyLabel- (instancetype)initWithFrame:(CGRect)frame {    self = [super initWithFrame:frame];    if (self) {        self.numberOfLines = 0;        self.pasteBoard = [UIPasteboard generalPasteboard];        [self attachTapHandle];    }    return self;}- (void)attachTapHandle {    self.userInteractionEnabled = YES;    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap:)];    tap.numberOfTapsRequired = 1;    [self addGestureRecognizer:tap];}//响应事件- (void)handleTap:(UITapGestureRecognizer *)sender {    [self becomeFirstResponder]; //UILabel默认是不能响应事件的,所以要让它成为第一响应者    UIMenuController *menuVC = [UIMenuController sharedMenuController];    [menuVC setTargetRect:self.frame inView:self.superview]; //定位Menu    [menuVC setMenuVisible:YES animated:YES]; //展示Menu}- (BOOL)canBecomeFirstResponder { //指定UICopyLabel可以成为第一响应者 切忌不要把这个方法不小心写错了哟, 不要写成 becomeFirstResponder    return YES;}-(BOOL)canPerformAction:(SEL)action withSender:(id)sender { //指定该UICopyLabel可以响应的方法    if (action == @selector(copy:)) {        return YES;    }    if (action == @selector(paste:)) {        return YES;    }    if (action == @selector(delete:)) {        return YES;    }    if (action == @selector(selectAll:)) {        return YES;    }    if (action == @selector(cut:)) {        return YES;    }    return NO;}- (void)paste:(id)sender {//    self.text = self.pasteBoard.string;//    NSLog(@"粘贴的内容%@", self.pasteBoard.string);        self.backgroundColor = self.pasteBoard.color;    }- (void)copy:(id)sender {//    self.pasteBoard.string = self.text;//    NSLog(@"复制");    self.pasteBoard.color = self.backgroundColor;}-(void)cut:(id)sender {    self.pasteBoard.string = self.text;    self.text = @"";    NSLog(@"剪切");}- (void)delete:(id)sender {    self.text = nil;    self.pasteBoard = nil;}- (void)selectAll:(id)sender {    UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];    pasteBoard.string = self.text;    self.textColor = [UIColor blueColor];    NSLog(@"全选的数据%@", pasteBoard.string);}@end
</pre><pre name="code" class="objc">//创建一个视图控制器,添加两个UICopyLabel,实现文字的复制粘贴,剪切效果
<pre name="code" class="objc">- (void)viewDidLoad {    [super viewDidLoad];    self.navigationItem.title = @"系统";    //1.系统自带的复制粘贴功能    UICopyLabel *copyLabel = [[UICopyLabel alloc]initWithFrame:CGRectMake(10, 80, 300, 200)];    copyLabel.backgroundColor = [UIColor cyanColor];    copyLabel.text = @"看着看着,就累了,星光也暗了;听着听着, 就醒了, 开始埋怨了;回头发现, 你不见了, 突然我乱了。";    [self.view addSubview:copyLabel];         UICopyLabel *copyLabel2 = [[UICopyLabel alloc]initWithFrame:CGRectMake(10, 350, 300, 200)];    copyLabel2.backgroundColor = [UIColor orangeColor];    copyLabel2.text = @"";    [self.view addSubview:copyLabel2];}



//代码二-  自定义菜单项

////  CustomMunelabel.m//  PastePractice////#import "CustomMunelabel.h"@interface CustomMunelabel ()@property UIPasteboard *pBoard;@end@implementation CustomMunelabel- (instancetype)initWithFrame:(CGRect)frame {    if (self = [super initWithFrame:frame]) {        self.numberOfLines = 0;        [self attachTapGesture];        self.pBoard = [UIPasteboard generalPasteboard];    }    return self;}- (void)attachTapGesture{    self.userInteractionEnabled = YES;    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTapAction:)];    tap.numberOfTapsRequired = 1;    [self addGestureRecognizer:tap];}- (void)handleTapAction:(UITapGestureRecognizer *)sender {    [self becomeFirstResponder];    UIMenuItem *copyMenuItem = [[UIMenuItem alloc]initWithTitle:@"复制" action:@selector(copyAction:)];    UIMenuItem *pasteMenueItem = [[UIMenuItem alloc]initWithTitle:@"粘贴" action:@selector(pasteAction:)];    UIMenuItem *cutMenuItem = [[UIMenuItem alloc]initWithTitle:@"剪切" action:@selector(cutAction:)];        UIMenuController *menuController = [UIMenuController sharedMenuController];            [menuController setMenuItems:[NSArray arrayWithObjects:copyMenuItem, pasteMenueItem,cutMenuItem, nil]];    [menuController setTargetRect:self.frame inView:self.superview];    [menuController setMenuVisible:YES animated: YES];}-(BOOL)canBecomeFirstResponder {    return YES;}- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {    if (action == @selector(copyAction:)) {        return YES;    }    if (action == @selector(pasteAction:)) {        return YES;    }    if (action == @selector(cutAction:)) {        return YES;    }    return NO; //隐藏系统默认的菜单项}#pragma mark 实现方法- (void)copyAction:(id)sender {    self.pBoard.string = self.text;    NSLog(@"粘贴的内容为%@", self.pBoard.string);}- (void)pasteAction:(id)sender {    self.text = self.pBoard.string;}- (void)cutAction:(id)sender {    self.pBoard.string = self.text;    self.text = nil;}@end
使用方法和UICopy一样






1 0
原创粉丝点击