UIPasteboard 粘贴板

-(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];  
} 
-(void)handleTap:(UIGestureRecognizer*) recognizer{  
    [self becomeFirstResponder];  
    UIMenuController *menu = [UIMenuController sharedMenuController];  
    [menu setTargetRect:self.frame inView:self.superview];  
    [menu setMenuVisible:YES animated:YES];  
} 

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

-(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;  
} 

 //=========

在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数据类型也可使用),类似于这样:

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。

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

UPDATED:

iOS7修改了UIPasteboard的部分设计。
这此之前,你只要知道任何一个UIPasteboard的Name,就能访问其中的内容,而现在,只有在同一CFBundleIdentifier标识下的App才能共享内容,如com.mycompany.a和com.mycompany.b,它们的com.mycompany部分是一样的,就能共享
posted @ 2016-03-22 16:19  木易的博客  阅读(1159)  评论(0编辑  收藏  举报