iOS开发(OC)iOS开发

YYTextView使用笔记

2020-04-19  本文已影响0人  reyzhang

如何设置 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];
上一篇下一篇

猜你喜欢

热点阅读