label的长按复制的功能

来源:互联网 发布:海口网站排名优化 编辑:程序博客网 时间:2024/05/22 06:36

经查询,系统中支持复制功能的控件有如下3种:UITextView,UITextField,UIWebView
所以要想用UILabel支持复制功能,如下图所示,则需要自定义

这里写图片描述

一,添加一个label的类别

//.h#import <UIKit/UIKit.h>@interface UILabel (Copy)@property (nonatomic,assign) BOOL isCopyable;@end//.m#import "UILabel+Copy.h"@implementation UILabel (Copy)- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {    return (action == @selector(copyText:));}- (void)attachTapHandler {//    使UILabel成为第一响应者    self.userInteractionEnabled = YES;    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];    [self addGestureRecognizer:longPress];}//  处理手势相应事件- (void)handleTap:(UIGestureRecognizer *)longPress {    [self becomeFirstResponder];    //UIMenuController的要求,要显示UIMenuController对象的UIView必须是当前UIWindow的第一响应者    UIMenuItem *item = [[UIMenuItem alloc] initWithTitle:@"复制" action:@selector(copyText:)];    [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:item]];    [[UIMenuController sharedMenuController] setTargetRect:CGRectMake(self.width/3+self.left, self.top+17, 100, 20) inView:self.superview];    [[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];}//  复制时执行的方法- (void)copyText:(id)sender {    //系统的粘贴板UIPasteboard    UIPasteboard *pBoard = [UIPasteboard generalPasteboard];    //  有些时候只想取UILabel的text中的一部分    if (objc_getAssociatedObject(self, @"expectedText")) {        pBoard.string = objc_getAssociatedObject(self, @"expectedText");    } else {        //  因为有时候 label 中设置的是attributedText,而 UIPasteboard 的string只能接受 NSString 类型,所以要做相应的判断        if (self.text) {            pBoard.string = self.text;        } else {            pBoard.string = self.attributedText.string;        }    }}- (BOOL)canBecomeFirstResponder {    return [objc_getAssociatedObject(self, @selector(isCopyable)) boolValue];}- (void)setIsCopyable:(BOOL)number {    objc_setAssociatedObject(self, @selector(isCopyable), [NSNumber numberWithBool:number], OBJC_ASSOCIATION_ASSIGN);    [self attachTapHandler];}- (BOOL)isCopyable {    return [objc_getAssociatedObject(self, @selector(isCopyable)) boolValue];}

二,方法的调用

_detilLab.isCopyable=YES;
0 0