关于输入框富文本实时输入字体颜色变化问题
项目开发中做聊天框架项目,使用自己开发的聊天键盘(表情,更多,输入框),而不使用第三方框架过程,会出现较多问题,目前在关于QQ那样的@弹窗,包含搜索,这里描述的是关于输入框中当选中需要@名字之后,名字变色,后接着输入的文字需要不受其影响
当我开发@弹窗过程中,根据需求实现@名字变色,通过富文本改,但是出现缺陷,就是接着输入的文字,或符号都是受到富文本影响变成了同样字体颜色,这个就比较苦恼,后面是找到一个解决方案:
- 在输入框实时输入的协议中设置输入框的一个属性 ,typingAttributes;
- 寻找另外的技术方案 ;
因为是使用UITextView作为聊天输入框,所以在它的协议中方法实现设置属性
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
// 发送键&回车键处理
if (text == "\n") {
if (isShowKeyboard) {
isShowKeyboard = true
}
// sendChatMessage()
return false
}
//避免@名字后的文字输入,字体颜色受富文本影响
if NSMaxRange(range) == textView.textStorage.length {
if textView.textStorage.length != 0 {
let defaultColor = ZYColor.mainWhite_a(._90)!
let defaultFont = ZYFont.pingFangHK_Regular_size(14)!
var isOld = true
textView.textStorage.enumerateAttributes(in: NSRange(location: textView.textStorage.length - 1, length: 1), options: NSAttributedString.EnumerationOptions.reverse) { atts, range, stop in
if atts.keys.count > 2{
isOld = false
}
let colorL = atts[.foregroundColor] as! UIColor
let fontL = atts[.font] as! UIFont
if colorL.isEqual(defaultColor) || fontL.isEqual(defaultFont){
isOld = false
}
}
if !isOld {
self.chatTextView.typingAttributes = [.foregroundColor: defaultColor,.font:defaultFont]
}
}
}
// let defaultColor = ZYColor.mainWhite_a(._90)!
// let defaultFont = ZYFont.pingFangHK_Regular_size(14)!
// self.chatTextView.typingAttributes = [.foregroundColor: defaultColor,.font:defaultFont]
return true
}
通过这个从而可以使后期输入的文字不受前面的富文本的影响改变颜色
后面发现在中间插入的时候没有触发进入里面设置属性,所以想到只需要设置typingAttributes即可,所以就直接去掉全面的代码,只保留三句代码
let defaultColor = ZYColor.mainWhite_a(._90)!
let defaultFont = ZYFont.pingFangHK_Regular_size(14)!
self.chatTextView.typingAttributes = [.foregroundColor: defaultColor,.font:defaultFont]
这样就都可以设置,发现这样也可行,可惜在后面发现了另一个缺陷,在使用系统的九宫格键盘输入是,当选择@名字,接着在九宫格键盘快速点击某一个按键,发现文字受到富文本影响改变颜色了,所以后面就只能寻找另外的方案