切换iOS TextField的isSecureTextEntry时光标位置异常(iPhone 6)
解决iOS TextField切换isSecureTextEntry时光标位置错误的问题
我之前在iPhone 6上也碰到过一模一样的问题,直接用textField?.isSecureTextEntry = !textField.isSecureTextEntry切换密码可见性时,光标总会跳错位置,给你几个亲测有效的解决办法:
方法一:保存并恢复光标选中范围
这是最常用的方案,切换属性前后手动记录和恢复光标位置,能完美适配大部分场景:
// 先保存当前光标选中的范围 let selectedRange = textField?.selectedTextRange // 切换密码可见状态 textField?.isSecureTextEntry = !textField.isSecureTextEntry // 恢复之前的光标位置 textField?.selectedTextRange = selectedRange
方法二:重置文本并定位光标到末尾
如果第一种方法偶尔还是有异常,可以尝试先保存文本,切换后重新赋值再精准定位光标:
let currentText = textField?.text textField?.isSecureTextEntry = !textField.isSecureTextEntry // 重新设置文本确保内容完全一致 textField?.text = currentText // 将光标定位到文本末尾(也可根据需求调整到其他位置) if let endPosition = textField?.endOfDocument { textField?.selectedTextRange = textField?.textRange(from: endPosition, to: endPosition) }
方法三:延迟执行适配旧系统
iPhone 6搭载的iOS版本通常比较旧,有时候UI更新会有延迟,用异步队列包裹操作可以避免这个问题:
DispatchQueue.main.async { let selectedRange = self.textField?.selectedTextRange self.textField?.isSecureTextEntry = !self.textField.isSecureTextEntry self.textField?.selectedTextRange = selectedRange }
问题原因小科普
之所以会出现光标位置错误,是因为切换isSecureTextEntry属性时,系统会重新渲染TextField的内容,默认会把光标重置到文本开头,所以手动保存并恢复选中范围就能从根源解决这个问题啦。
内容的提问来源于stack exchange,提问作者Pramod More
相关产品推荐
相关产品推荐

