IOS开发之UI进阶(UILabel添加长按复制)(UIMenuController的运用)

IOS开发之UI进阶(UILabel添加长按复制)(UIMenuController的运用),第1张

添加文件CopyLabel,继承自UILabel,改写awakeFromNib方法让其可以在storyboardxib文件中也可以生效更改为该类,即可长按复制需要别的功能,添加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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/994527.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存