Label--自定义可粘贴复制的Label

在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 —   颜色数组


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

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

新创建一个类:CopyLabel

CopyLabel.h文件

#import <UIKit/UIKit.h>

typedef NS_ENUM(NSInteger,CopyLabelStatus) {
    COPY_PASTE_LABEL,  //有复制和粘贴功能label
    COPY_LABEL //只有复制功能label
};

@interface CopyLabel : UILabel
//创建Label时可根据不同的类型来实现不同的功能
@property (nonatomic, assign) CopyLabelStatus labelType;
@end


CopyLabel.m文件

#import "CopyLabel.h"

@implementation CopyLabel

//通过正常创建的初始化方法,绑定事件
- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self){
        [self attachTapHandler];
    }
    return self;
}

通过xib文件创建的初始化方法,绑定事件
-(void)awakeFromNib{
    [super awakeFromNib];
    [self attachTapHandler];
}

//为了能接收到事件(能成为第一响应者),我们需要覆盖一个方法:
-(BOOL)canBecomeFirstResponder{
    return YES;
}

// 可以响应的方法
//此方法中只相应了复制和粘贴两个方法,也就是弹出的面板中只有复制和粘贴两个按钮。
//其它方法都返回No代表禁止,面板内不会出现相应的按钮。
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
    switch (self.labelType) {
        case COPY_PASTE_LABEL:
            //允许复制操作、粘贴操作
            if (action == @selector(paste:)) {
                return (action == @selector(paste:));
            }else if (action == @selector(copy:)){
                return (action == @selector(copy:));
            }
            break;
        case COPY_LABEL:
            //只允许复制操作
            return (action == @selector(copy:));
            break;
        default:
            break;
    }
    //其它操作不允许
    return NO;
}

//针对于响应方法的实现,点击copy按钮时调用此方法
-(void)copy:(id)sender{
    UIPasteboard *pboard = [UIPasteboard generalPasteboard];
    pboard.string = self.text;
}
//针对于响应方法的实现,点击paste按钮时调用此方法
-(void)paste:(id)sender{
    UIPasteboard *pboard = [UIPasteboard generalPasteboard];
    self.text = pboard.string;
}

//有了以上三个方法,我们就能处理copy和paste了,当然,在能接收到事件的情况下:
//UILabel默认是不接收事件的,我们需要自己添加touch事件
-(void)attachTapHandler{
    self.userInteractionEnabled = YES;  //用户交互的总开关
    UILongPressGestureRecognizer * longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    [self addGestureRecognizer:longPress];
}

//接下来,我们需要处理这个tap,以便让菜单栏弹出来:
-(void)handleTap:(UIGestureRecognizer*) recognizer{
    //if判断是为了保证长按手势只执行一次
    if (recognizer.state == UIGestureRecognizerStateBegan) {
        [self becomeFirstResponder];
        [[UIMenuController sharedMenuController] setTargetRect:self.frame inView:self.superview];
        [[UIMenuController sharedMenuController] setMenuVisible:YES animated: YES];
    }
}
//这样一来,一个可复制的UILabel就诞生了!它能处理接收点击、弹出菜单栏、处理copy,这是一个很普通的可复制控件。
@end



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值