前言:UITextField通常会设置一个输入限制位数,这会导致输入字符达到了限制位数时就无法继续输入,并且系统直接返回。当只剩下1位限制位数时,中文输入无法打全拼音进行输入。
判断UITextField是否在输入状态方法(是否处于高亮状态)
/// 判断是否在输入状态
private func isTextFieldInputState(textField: UITextField) -> Bool {
if let textRange = textField.markedTextRange {
if let position = textField.position(from: textRange.start, offset: 0) {
return true
}
}
return false
}
- 判断中文是否属于输入状态
/// 判断是否为中文输入状态
private func isTextFieldInputState(textField: UITextField) -> Bool {
let lang = textField.textInputMode?.primaryLanguage
if lang == "zh-Hans" {
if let textRange = textField.markedTextRange {
if let position = textField.position(from: textRange.start, offset: 0) {
return true
}
}
}
return false
}
UITextFieldDelegate方法编写
func textFieldDidChangeSelection(_ textField: UITextField) {
var inputText = textField.text ?? ""
/// textFiledLimitNum为textField限制位数
/// 当不在输入状态或者输入结束后进行输入框内容长度判断和截取
if !isTextFieldInputState(textField: textField) {
if textField.text?.count ?? 0 > textFiledLimitNum {
///超出字符限制toast回调提示
textFieldMoreRangeToastAction?()
///进行截取输入框限制长度部分内容
let index = inputText.index(inputText.startIndex, offsetBy: textFiledLimitNum)
inputText = inputText[..<index].description
textField.text = String(inputText)
}
}
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string == "" {
return true
}
/// 当点击return,收起键盘
if string == "\n" {
textField.resignFirstResponder()
return false
}
/// 当输入内容长度大于限制长度时,并且正在处于输入状态时,允许继续输入
/// 输入结束后再进行内容截取
if textField.text?.count ?? 0 > textFiledLimitNum {
if isTextFieldInputState(textField: textField) {
return true
}
}
return true
}
整理不易,望大家多多点赞收藏!感谢大家!