UITextView 光标定位
在使用UITextView的时候, 如何在光标的位置插入字符 或者 图片? 以下Demo为你解答:
应用背景:键盘自定义emoji表情
#pragma mark - KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
// NSString *newFaceName = change[@"new"];
NSString *newFaceName = [change objectForKey:NSKeyValueChangeNewKey];
if (!newFaceName || [newFaceName isKindOfClass:[NSNull class]]) {
return;
}
// 在光标位置插入表情
[self textWithString:newFaceName];
// [self attributedTextWithString:newFaceName];
}
#pragma mark - text && attributedText
- (void)textWithString:(NSString *)newFaceName
{
// 1.1 获取当前输入的文字
NSMutableString *string = [NSMutableString stringWithString:_txView.text];
// 1.2 获取光标位置
NSRange rg = _txView.selectedRange;
if (rg.location == NSNotFound) {
// 如果没找到光标,就把光标定位到文字结尾
rg.location = _txView.text.length;
}
// 1.3 替换选中文字
[string replaceCharactersInRange:rg withString:newFaceName];
_txView.text = string;
// 1.4 定位光标
_txView.selectedRange = NSMakeRange(rg.location + newFaceName.length, 0);
}
// _txView.attributedText && 虽然能在发送微博时显示图片
// 但是由于plist 文件中的 png名字与官方不一样
// 所以发送出去的内容微博不能识别 emoji 表情
- (void)attributedTextWithString:(NSString *)newFaceName
{
// 1.1 获取当前输入的文字
NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] init];
// 1.1.1 拼接之前的文字(图片和文字)
[attributedText appendAttributedString:_txView.attributedText];
// 1.2 获取光标位置
NSRange rg = _txView.selectedRange;
if (rg.location == NSNotFound) {
// 如果没找到光标,就把光标定位到文字结尾
rg.location = _txView.text.length;
}
// 1.3 替换选中文字
// 1.3.1 加载图片
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [UIImage imageNamed:newFaceName];
CGFloat attchWH = _txView.font.lineHeight;
attachment.bounds = CGRectMake(0, -3, attchWH, attchWH);
NSAttributedString *attributedString = [NSAttributedString attributedStringWithAttachment:attachment];
// 1.3.2 拼接图片
[attributedText insertAttributedString:attributedString atIndex:rg.location];
// 1.3.3 设置字体大小,_txView.font--> null ?!
// NSRange range = NSMakeRange(0, attributedText.length);
// [attributedText addAttribute:NSFontAttributeName value:_txView.font range:range];
// 1.3.4 替换文字
_txView.attributedText = attributedText;
// 1.4 定位光标
_txView.selectedRange = NSMakeRange(rg.location + 1, 0);
}
利用KVO监听输入的emoji表情
if (!_faceView) {
_faceView = [[FaceView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 0)];
[_faceView.faceImgView addObserver:self forKeyPath:kFaceNameKVO options:NSKeyValueObservingOptionNew context:nil];
}
部分Demo:GitHub FaceViewDemo
UITextView 光标定位的更多相关文章
- UITextField限制中英文字数和光标定位以及第三方输入限制问题
先自定义一个UITextField的子类HLNavTextField,在控制器里调用子类的- (void)limitHansLength:(int)hans otherLength:(int)othe ...
- input长度随输入内容动态变化 input光标定位在最右侧
<input type="text" onkeydown="this.onkeyup();" onkeyup="this.size=(this. ...
- input输入框的光标定位的问题
input输入框的光标定位的问题 在给input输入框赋值的时候,或者在我之前写模拟下拉框js组件的时候,时不时会碰到光标的小bug问题,比如键盘中的 上移或者下移操作,在浏览器中光标会先移到最前端, ...
- js实现类似微信网页版在可编辑的div中粘贴内容时过滤剪贴板的内容,光标始终在粘贴内容后面,以及将光标定位到最后的方法
过滤剪贴板内容以及定位可编辑div光标的方法: <!DOCTYPE html><html lang="en"><head> <meta ...
- 可编辑div,将光标定位到文本之后
类似qq回复一样,某人评论之后,在对评论进行回复之后,将光标定位到文本之后: function set_focus() { el=document.getElementById('guestbook_ ...
- JS控制光标定位,定位到文本的某个位置
这是一个数字密码,要能够智能的跳转到文本的某个位置,就需要通过JS来控制跳转! 1.onkeyup监听 <input class="put" id="number- ...
- TextBox光标定位到文本末尾
private void RichTextBox1_TextChanged(object sender, EventArgs e) { this.richTextBox1.Select(richTex ...
- contenteditable 光标定位到最后
在Vue做项目时,做了一个div[contenteditable=true]的组件作为文本输入框 在非手动输入值后,光标会丢失,经测试以下这段代码可用,直接将光标定位到最后 function keep ...
- IOS textView获取光标定位,以及选中
当textview成为第一响应者的时候就会调用一个协议方法 - (void)textViewDidChangeSelection:(UITextView *)textView; 在这个协议方法中可以实 ...
随机推荐
- maven(18)-mybatis generator插件
generator的作用 使用mybatis框架,在初始项目或修改数据库时,相应的要在JAVA项目中去写一些数据模型文件,DAO,映射XML等配置,而这个插件的作用就是自动生成这些文件,以节省大 ...
- Jsp程序要在Tomcat下运行
首先,回顾下jsp与servlet的区别与联系 JSP经过编译后就成了servlet JSP本质就是Servlet,JVM只能识别java类,不能识别JSP代码,Web容器将JSP代码编译成JVM能够 ...
- Azure Linux 虚机上配置 RAID 的常见问题及解决方案
简介 独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),简称磁盘阵列.能增强数据集成度,增强容错功能,增加处理量或容量.详情参见这篇文章. 配置 ...
- CentOS使用PXE网络启动自动安装操作系统
PXE工作原理简介 PXE (Preboot Excution Environment) 预启动执行环境 工作环境介绍: 要实现PXE自动网络安装CentOS至少需要两台主机 1)PXE服务器PXE ...
- 深入浅出SharePoint——获取Choice Field的Mapping value
list field对应的caml定义如下 <Field Type="Choice" DisplayName="Inspection Result" Re ...
- Dictionary<Tkey.TValue>与SortedList
一.概述 表示Key/Value集合,可以添加删除元素,允许按Key来访问元素.是Hashtable的泛型等效类. 它需要一个相等实现来确定键是否相等,可以使用实现了IEqualityComparer ...
- Windows环境下JDK的配置及多版本JDK切换的方法记录
(这里记录了笔者了解的关于JDK环境配置的信息,以及针对系统上存在不同版本JDK时所尝试的解决方案.具体来说,是已安装 JDK 8 后,又安装了 JDK 9 时所遇到的问题和尝试的解决方法.这次记录以 ...
- JAVA对象与内存控制
1.1 实例变量和类变量 成员变量和局部变量: 局部变量分为三大类: 1)形参:在方法签名中定义的局部变量,由方法调用者为其赋值,随方法的结束而消亡. 2)方法内的局部变量:在方法内定义的局部变量,随 ...
- js oc与线程
分属不同的线程 //定义需要暴露给js的内容,这里我们只暴露personName和queryPersonName接口 @protocol PersonProtocol <JSExport> ...
- jQuery Datatable 表格插件
Datatable 总体来说很好用,可以实现即时搜索和排序.但是只能用于数据量较少的情况下,如果数据量超过1K建议还是用表格加翻页,不然会很慢. datatable 中文网 http://datat ...