struct CustomTextfield: UIViewRepresentable {
@Binding var text: String
func makeUIView(context: Context) -> UITextField {
let view = UITextField()
view.setLeftPaddingPoints(10)
view.isUserInteractionEnabled = true
view.backgroundColor = .white
view.layer.borderColor = uiColorE5E5E5.cgColor
view.layer.borderWidth = 1
view.layer.cornerRadius = 4
view.font = UIFont.systemFont(ofSize: 16, weight: .bold)
view.textColor = uiColorD57B21
view.delegate = context.coordinator
view.keyboardType = UIKeyboardType.numberPad
return view
}
func updateUIView(_ uiView: UITextField, context: Context) {
uiView.text = text
}
func makeCoordinator() -> CustomTextfield.Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, UITextFieldDelegate {
var control: CustomTextfield
init(_ control: CustomTextfield) {
self.control = control
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
self.control.text = textField.text!
return true
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// 获取输入的文本,移除向输入框中粘贴文本时,系统自动加上的空格(iOS11上有该问题)
let new = string.replacingOccurrences(of: " ", with: "")
// 获取编辑前的文本
var old = NSString(string: textField.text ?? "")
// 获取编辑后的文本
old = old.replacingCharacters(in: range, with: new) as NSString
// 获取数字的字符集
let number = CharacterSet(charactersIn: "0123456789")
// 判断编辑后的文本是否全为数字
if old.rangeOfCharacter(from: number.inverted).location == NSNotFound {
// number.inverted表示除了number中包含的字符以外的其他全部字符
// 如果old中不包含其他字符,则格式正确
// 允许本次编辑
textField.text = old as String
// 移动光标的位置
DispatchQueue.main.async {
let beginning = textField.beginningOfDocument
let position = textField.position(from: beginning, offset: range.location + new.count)!
textField.selectedTextRange = textField.textRange(from: position, to: position)
}
}
return false
}
}
下面的例子只能输入小数,比如38.12211
struct gpsTextfield: UIViewRepresentable {
@Binding var text: String
func makeUIView(context: Context) -> UITextField {
let textfield = UITextField()
textfield.keyboardType = .numberPad
textfield.textAlignment = .left
textfield.delegate = context.coordinator
textfield.text = text
textfield.backgroundColor = uiColorF9F9F9
textfield.layer.borderColor = uiColorC5C5C5.cgColor
textfield.layer.cornerRadius = 4
textfield.layer.borderWidth = 1
textfield.font = UIFont.init(name: "KozGoPro-Bold", size: 16)
textfield.setLeftPaddingPoints(10)
return textfield
}
func updateUIView(_ uiView: UITextField, context: Context) {
uiView.text = text
}
func makeCoordinator() -> gpsTextfield.Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, UITextFieldDelegate {
var control: gpsTextfield
init(_ control: gpsTextfield) {
self.control = control
}
func textFieldDidChangeSelection(_ textField: UITextField) {
self.control.text = textField.text!
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
NotificationCenter.default.post(name: .kmpointEditBegin, object: nil, userInfo: nil)
return true
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
self.control.text = textField.text!
textField.endEditing(true)
return true
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// 获取输入的文本,移除向输入框中粘贴文本时,系统自动加上的空格(iOS11上有该问题)
let new = string.replacingOccurrences(of: " ", with: "")
// 获取编辑前的文本
var old = NSString(string: textField.text ?? "")
// 获取编辑后的文本
old = old.replacingCharacters(in: range, with: new) as NSString
// 获取数字的字符集
let number = CharacterSet(charactersIn: "0123456789.")
// 判断编辑后的文本是否全为数字
if old.rangeOfCharacter(from: number.inverted).location == NSNotFound && CommonUtil.checkLocationInput(gpsString: old as String) {
// number.inverted表示除了number中包含的字符以外的其他全部字符
// 如果old中不包含其他字符,则格式正确
// 允许本次编辑
textField.text = old as String
// 移动光标的位置
DispatchQueue.main.async {
let beginning = textField.beginningOfDocument
let position = textField.position(from: beginning, offset: range.location + new.count)!
textField.selectedTextRange = textField.textRange(from: position, to: position)
}
}
return false
}
}
}
// 判断小数点个数
public class func checkLocationInput(gpsString: String) -> Bool {
var num = 0
for ch in gpsString
{
if ch == "." {
num = num + 1
}
}
if num > 1 {
return false
}
return true
}
}