类似于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];
}
效果图
二、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的信息保存在剪切板在其他应用使用
效果图
下面这个就是复制到浏览器的Label内容
三、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];这个函数。
如果没有隐藏掉输入弹出键盘,那么就是这样的
所以隐藏输入键盘之后才算达到目的。
效果图
四、Demo下载
Github下载:https://github.com/DamonHu/HudongBlogDemo/tree/master/copyDemo
五、Demo演示效果
六、参考文章
- [](http://stackoverflow.com/questions/12666834/selectall-uitextfield-does-not-always-select-all)IOS开发_iphone 实现剪贴板操作_iphone 复制粘贴功能(转)
- iOS学习笔记9—精通UIPasteboard 粘贴板
- iOS 改变UITextField中光标颜色
- IOS 关闭键盘 退出键盘 的5种方式
- selectall uitextfield does not always select all
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/358.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!