Swift 中如何实现 UITextField 输入内容中间显示省略号的效果
UITextField实现中间省略号展示方案
可以实现,不需要依赖UITextView相关方案,通过自定义UITextField的输入截断逻辑即可完成私钥场景下首尾保留、中间省略的展示需求。
核心思路
不修改UITextField原生截断逻辑,通过输入代理监听内容变化,存储完整的原始私钥,仅对展示层的文本做中间截断处理,不影响实际业务使用的完整内容。
实现步骤
1. 定义必要存储属性
首先需要新增两个属性分别存储原始内容和配置展示规则:
// 存储完整的原始私钥,业务侧实际取值用这个属性 private var originalPrivateKey: String = "" // 首尾各保留的字符数,可根据需求调整,私钥场景通常设为4~6即可 private let keepCharCount: Int = 4
2. 实现输入代理截断逻辑
在UITextField的textField(_:shouldChangeCharactersIn:replacementString:)代理方法中处理内容截断:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // 拼接得到最新的完整私钥内容 let updatedString = (originalPrivateKey as NSString).replacingCharacters(in: range, with: string) originalPrivateKey = updatedString // 内容长度不足不需要截断,直接展示完整内容 guard updatedString.count > keepCharCount * 2 else { textField.text = updatedString return true } // 拼接首尾内容加中间省略号赋值给展示层 let prefix = String(updatedString.prefix(keepCharCount)) let suffix = String(updatedString.suffix(keepCharCount)) textField.text = "\(prefix)...\(suffix)" // 禁止原生默认赋值,使用自定义截断后的内容 return false }
3. 交互优化(可选)
如果需要支持复制功能,避免用户复制到截断后的内容,可以自定义UITextField子类重写复制方法:
class PrivateKeyTextField: UITextField { var originalContent: String = "" override func copy(_ sender: Any?) { UIPasteboard.general.string = originalContent } }
注意事项
- 业务侧需要使用私钥做校验、导出等操作时,必须取存储的
originalPrivateKey,不要取UITextField的text属性,避免拿到截断后的无效内容 - 如果需要适配不同宽度的输入框,可以通过计算文本宽度动态调整
keepCharCount的数值,适配不同屏幕尺寸
内容的提问来源于stack exchange,提问作者miki
相关产品推荐
相关产品推荐

