类似于textField,长按就会默认跳出复制的选项,但是默认选中的就是你手指点击的那个文字,想全选的话必须手动选择全选才可以,而最近碰到一个需求就是要点击文字,默认就是选中所有的文字,比如游戏中的邀请码,应用中的推广码等,所以默认全选复制肯定比再点击全选便捷,一般就是默认选择或者弹出提醒。这个就是这篇文章的使用意义

方案思路

一般显示文字的地方一般就是Label,textField,textView,Button这几种地方,所以要想默认全选复制文字,也就这几个控件,所以就从这里入手,所以三种方案分别是,从上到下,简单到麻烦

  • textView加手势
  • Label加手势(button按钮和这个是一个原理,所以不再写button的了)
  • textField

一、textView加手势使用

textView主要就是显示文字的一个View,这里的方案就是先禁止textView的输入,因为发现textView可以单独禁止输入,并且禁止输入不会影响选择,但是禁止输入会影响响应他UITextViewDelegate的代理函数,所以需要另外加上一个手势去响应点击事件,函数主要就是响应select all这个函数

    self.textView = [[UITextView alloc] initWithFrame:CGRectMake(100,500,300,40)];
    [self.textView setText:@"Damon胡东东"];
    self.textView.delegate = self;
    [self.textView setTextColor:[UIColor redColor]];
    [self.view addSubview:self.textView];
    //禁止输入
    self.textView.editable =NO;
    //增加点击手势
    UITapGestureRecognizer *tap2 =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(testView)];
    [self.textView addGestureRecognizer:tap2];

手势的响应函数

-(void)testView{
    NSLog(@"textView的手势");
    [self.textView selectAll:self];
}

效果图

 title=

二、Label加手势

Label没有select all的响应函数,并且不会响应点击事件,所以需要给Label加上点击手势去响应点击事件,内容的复制使用系统的剪切板来保存数据,交互方式选择弹窗提醒。

     self.label = [[UILabel alloc] initWithFrame:CGRectMake(100, 300, 300, 40)];
    [self.label setText:@"哈哈哈"];
    [self.label setTextColor:[UIColor grayColor]];
    [self.view addSubview:self.label];
    //增加手势
    [self.label setUserInteractionEnabled:YES];
    UITapGestureRecognizer *tap =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(testLabel:)];
    [self.label addGestureRecognizer:tap];

手势的响应函数

-(void)testLabel:(id)sender{
    NSLog(@"Label的手势");
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"点击拷贝Label信息" preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *al = [UIAlertAction actionWithTitle:@"拷贝" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        //复制
        UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
        [pasteboard setString:self.label.text];
        NSLog(@"拷贝成功");
    }];
    UIAlertAction *al2 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
    }];
    [alert addAction:al];
    [alert addAction:al2];
    [self presentViewController:alert animated:YES completion:nil];
}

UIPasteboard是系统的默认剪切板,所以可以把label的信息保存在剪切板在其他应用使用

效果图

 title=

下面这个就是复制到浏览器的Label内容

 title=

三、textField

textField是首先想到的,但是也是坑最多的,所以最后推荐他,textField是一个输入框,和textView的不同是如果禁止输入,不仅会影响UITextFieldDelegate代理函数的调用,还会影响内容的选择,所以不能禁止输入。

所以就要做这几件事来达到Label的效果,隐藏光标,输入的时候禁止输入框的弹出,要可以选择

所以就这么做了

    self.text1 = [[UITextField alloc] initWithFrame:CGRectMake(100, 400, 300, 40)];
    [self.text1 setText:@"东东的博客"];
    [self.text1 setTextColor:[UIColor grayColor]];
    [self.view addSubview:self.text1];
    [self.text1 setAdjustsFontSizeToFitWidth:YES];
    self.text1.tintColor=[UIColor clearColor];//隐藏输入光标
    self.text1.delegate = self;

然后在代理方法点击输入框开始输入的时候,

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    NSLog(@"textFieldDidBeginEditing");
    textField.inputView =[[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
//    [textField selectAll:textField];//并不是每次都调用,所以需要用performselector
    [textField performSelector:@selector(selectAll:) withObject:textField afterDelay:0.f];
}

inputView是响应text输入时的键盘,把它的frame设置成0从而达到隐藏的目的,因为没有直接隐藏或者既要响应点击还要禁止弹出键盘的方法,而选择使用performselector开其他线程来调用selectAll的方法是因为ios内部的实现会导致在textFieldDidBeginEditing中并没有每次都响应[textField selectAll:textField];这个函数。

如果没有隐藏掉输入弹出键盘,那么就是这样的

 title=

所以隐藏输入键盘之后才算达到目的。

效果图

 title=

四、Demo下载

Github下载:https://github.com/DamonHu/HudongBlogDemo/tree/master/copyDemo

五、Demo演示效果

六、参考文章


☟☟可点击下方广告支持一下☟☟

最后修改:2021 年 03 月 07 日
请我喝杯可乐,请随意打赏: ☞已打赏列表