-
添加文件
CopyLabel
,继承自
UILabel
,改写
awakeFromNib
方法让其可以在
storyboard
和
xib
文件中也可以生效 - 更改为该类,即可长按复制
-
需要别的功能,添加
UIMenuItem
和相应的方法就好了
#import "CopyLabel.h"
@implementation CopyLabel
//在sb和xib文件生效
- (void)awakeFromNib{
[super awakeFromNib];
// 添加手势
[self setUp];
}
//代码初始化生效
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
[self setUp];
}
return self;
}
//添加长按手势
- (void)setUp{
//打开用户交互
self.userInteractionEnabled = YES;
//给lable添加手势
[self addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick:)]];
}
- (void)labelClick:(UILongPressGestureRecognizer *)sender{
//让其第一次长按生效
if(sender.state == UIGestureRecognizerStateBegan){
// 让label成为第一响应者,控件才需要,controller是不需要的
[self becomeFirstResponder];
//获得菜单 - 单例模式
UIMenuController * menu = [UIMenuController sharedMenuController];
//这里不需要设置UIMenuItem,用系统默认的就好了,默认有很多个
//设置菜单的位置
[menu setTargetRect:CGRectMake(0,0,0,0) inView:self];
//显示
[menu setMenuVisible:YES animated:YES];
}
}
//改写系统的copy方法,如果是自己的也要重写一个
- (void)copy:(UIMenuController *)menu{
//内容为空
if (!self.text) return;
// 复制文字到剪切板
UIPasteboard * paste = [UIPasteboard generalPasteboard];
paste.string = self.text;
}
//label具备成为第一响应者的资格,默认是关闭的,需要打开
- (BOOL)canBecomeFirstResponder{
return YES;
}
//通过第一响应者的这个方法告诉UIMenuController可以显示什么内容
//自带UIMenuController的控件可以通过重写这个方法禁用系统自带的Item
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{ //这样就是只打开copy,剩下的包括系统的Item都给关掉了
if (action == @selector(copy:))
return YES;
return NO;
}
@end
版权声明:本文为weixin_46926959原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。