You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:09:02