YYTextView使用笔记
如何设置 YYTextView 的行间距
YYTextView控件本身并没有设置行间距的属性, 如果要设置行间距,需要通过设置NSMutableAttributeString 富文本类来处理。
YYKit库中有对NSAttributeString的一个扩展,通过这个扩展我们可以很容易的给NSAttributeString 设置相关的富文本样式。如字体,字体颜色,行间距,字间距等等…
attrStr.yy_lineSpacing = 7;
我们知道 NSAttributeString类在初始化时需要指定富文本的字符串, 在设置完NSAttributeString类的实例后,并将这个实例赋给YYTextView的 attributeText 属性,即可实现富文本的设定。 要注意的是,初始NSAttributeString对象时的字符串一定不能为空,可以是任意字符,那么在初始YYTextView时,textView就有了默认值,而我们不希望这个默认值存在,并且希望以后输入的文本也能有我们设置的富文本样式,只需要将YYTextView的text 属性设置为空即可
如何对文本内容进行解析
如果使用YYTextView实现类似微博发表输入框的效果,在输入#话题# , @用户, 邮箱,url 等时可以被解析出来并高亮显示。 YYTextView在设计时已经考虑到这一点, YYTextView给我们提供了一个解析内容的协议,实现这个协议就可以完成对内容的解析 <YYTextParser>
需要实现YYTextParser协议的协议方法
- (BOOL)parseText:(NSMutableAttributedString *)text selectedRange:(NSRangePointer)range {}
实现完协议后,如果让指定的YYLabel, YYTextView能够解析文本,我们需要把协议实现者类实例化后,赋值给YY控件的textParser属性
self.txtLabel.textParser = self.txtParser;
还有一点需要注意, 如果使用了textParser属性, 那么再给YYTextView / YYLable赋值文本时就不能再使用 textLayout 来绑定,需要使用attributeText。 下面会有详情描述。
在插入表情时,如何将光标后移
在插入系统表情或自定义表情时,光标位置可能不会发生变化,需要在插入完成后,手动设置光标移动位置
插入表情后得到新的文本,获取文本的长度,以此来设置selectedRange属性来实现光标位置后移
NSString *currentText = ….
textView.selectedRange = NSMakeRange(currentText.length,0);
如何将表情插入到指定光标
// 将表情插入到当前光标
NSString *str = [faceArr objectAtIndex:sender.tag]; // — 取表情字符
NSRange range = [self.textView selectedRange]; // — 取当前光标位置
NSMutableString *top = [[NSMutableString alloc] initWithString:[self.textView text]];
NSString *addName = [NSString stringWithFormat:@"%@",str];
[top insertString:tempStr atIndex:range.location]; // — 将表情插入到当前光标位置
self.textView.text = top; //重置文本
当然最后还有把光标置为 添加过内容的后面,所以:
// 插入表情后 光标重新定位
NSUInteger length = range.location + [str length];
self.textView.selectedRange = NSMakeRange(length,0); // 重置光标位置
如何滚动到指定的插入位置
接上面的插入操作,在插入成功后,如果插入的位置超出了YYTextView可显示的高度,如果不做处理,无法查看插入的字符。需要执行如下代码:
[self.textView scrollRangeToVisible:range];
为什么设置控件的textParser属性后,文本并没有被解析
在给YYLabel控件绑定时使用了YYTextLayout封装了控件的位置,文本,大小,又通过设置textParser属性指定了文本的解析器。但实际运行后发现textParser的文本解析器并没有起到作用。怀疑textParser不能与textLayout属性并用。 尝试通过设置控件的attributedText属性替换textLayout来设置控件的富文本,再结合textParser来设置文本的内容解析。通过运行发现可行。
self.txtLabel.attributedText = layout.textLayout.text;
self.txtLabel.textParser = self.textParser;
如何模拟删除最后一个字符
在自定义表情键盘中,要添加删除功能。 删除YYTextView的最后一个字符,Emoji表情会占两个字节, 使用字符串截取处理不太容易。还好YYTextView有删除的函数,如下:
[self.textView deleteBackward];
判断YYTextView或UITextView中是否有文本内容
判断内容是否为空的方式,首先想到的就是检查 textView.text 的值是否为空, 这种方案没有问题。 不过控件也提供了方法用来检查是否为空,如下:
BOOL hasText = [self.textView hasText];
监听YYTextView文本内容的改变
文本内容的改变,除了去实现YYTextViewDelegate中的协议方法外。还可以通过“通知”来监听。 通知监听的方法如下:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidChangeNotification:) name:YYTextViewTextDidChangeNotification object:self.textView];