需求是这样的在文本输入框中插入通讯录联系人,并标记高亮,很愉悦的实现了效果,自己测试也OK,可是到了测试妹子手里就被玩坏了,普通文本多行是OK的,插入艾特某人高亮attributedText后文本就会变为一行,然后不管怎么输入都只有一行了,就像下图一样。
这里写下笔者实现艾特某人高亮的实现思路,就是在选取联系人后将人名直接拼到textview的text里,然后匹配关键字生成attributedText,赋值给textview 伪代码如下:
if let name = item.name {
this.textView.text.append("@\(name) ")
}
let text = this.textView.text
let names = this.maker.item.ante.map({ (item) -> String in
return item.name
})
this.textView.attributedText =text.getAddAttribute(keywords:names)
func getAddAttribute(keywords:[String]?) -> NSMutableAttributedString {
let style = NSMutableParagraphStyle()
style.lineBreakMode = .byTruncatingTail
let attributeString = NSMutableAttributedString.init(
string: self,
attributes: [...])
return attributeString.
}
产品希望看到效果的如下图插入联系人后高亮,不会多行变一行,原因是
lineBreakMode这个属性设置了byTruncatingTail后,多行属性就坏了,设置为换为.byWordWrapping就OK了,当然默认是byWordWrapping不会有问题,目前我们框架里富文本util func 改变了这一属性,这个应该为APPle爸爸的锅,这里记下笔记,希望可以帮助到遇到类似问题的同学。