UITextField使用attributedText时失焦出现意外默认字距调整问题如何解决
问题根因
这是UITextField的属性继承逻辑导致的:控件会默认将当前光标位置前一个字符的文本属性,作为后续新输入文本的默认属性。当控件失焦时,系统会将所有未显式指定字距属性的文本区域,统一应用当前光标关联的继承属性,也就是你遇到的、光标停在字距为4的字符后失焦,全局字距被覆写为4的情况。
你之前在textFieldShouldEndEditing中置空selectedTextRange的方案,本质是清除了光标位置关联的属性继承上下文,因此可以解决问题,但确实会增加不必要的代理逻辑。
更优雅的解决方案
方案1:为富文本全量显式设置字距属性
你在生成分组富文本时,先给整段文本统一设置默认字距为1,再单独给需要调整的分组位置设置字距为4。所有文本都有显式的字距属性后,系统就不会再自动用继承属性覆写全局了:
NSMutableAttributedString *mutableAttr = [[NSMutableAttributedString alloc] initWithString:formattedGroupText]; // 全局设置默认字距 [mutableAttr addAttribute:NSKernAttributeName value:@(1) range:NSMakeRange(0, mutableAttr.length)]; // 原有分组字距调整逻辑,给对应位置设置字距为4 // ... self.textField.attributedText = mutableAttr;
方案2:自定义UITextField子类统一处理
如果这类带字距调整的输入框在项目中多处使用,可以自定义UITextField子类,在attributedText的setter方法中自动重置默认输入属性,不需要业务层写额外代理:
@implementation CustomKernTextField - (void)setAttributedText:(NSAttributedString *)attributedText { [super setAttributedText:attributedText]; // 固定默认输入属性的字距为默认值,避免属性继承异常 NSMutableDictionary *defaultAttr = [self.defaultTextAttributes mutableCopy]; defaultAttr[NSKernAttributeName] = @(1); self.defaultTextAttributes = defaultAttr; } @end
这个方案对业务层完全透明,也不会影响正常的光标选择、输入交互。
内容的提问来源于stack exchange,提问作者Gergely
相关产品推荐
相关产品推荐

