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

  • Post author:
  • Post category:其他


  • 添加文件

    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 版权协议,转载请附上原文出处链接和本声明。