如何在UITextField占位符字符之间添加空格?

时间:2018-04-19 12:54:47

标签: swift uitextfield nsattributedstring placeholder

我想在UITextField placeHolder文字之间添加空格。

func setTextFieldCharacterSpacing(txtField: TextFieldCustomize) {
    let attributedString = NSMutableAttributedString(string: txtField.text!)
    attributedString.addAttribute(NSAttributedStringKey.kern, value: CGFloat(8.0), range: NSRange(location: 0, length: attributedString.length))
    txtField.attributedText = attributedString
}

修改1

我使用textField delegate方法完成了此操作。

extension LoginVC: UITextFieldDelegate {
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        CommonHelper.sharedInstance.setTextFieldCharacterSpacing(txtField: textField as! TextFieldCustomize)
        return true
    }
}

修改2

我有1 textField个安全条目。当我在未应用的字符之间的textFieldtxtField.attributedText空格中键入任何内容时。

没有安全字段 enter image description here

使用安全字段

enter image description here

这适用于Username,但不适用于password安全字段。

如何在安全条目textField中的字符之间添加空格?

提前致谢。

3 个答案:

答案 0 :(得分:1)

您的attirbutedString代码没问题,您只是将其置于textField的错误属性中。 attributedPlaceholder是正确的。 attributedText用于设置文本值而非占位符。

所以改变

txtField.attributedText = attributedString

textField.attributedPlaceholder = attributedString

以下是输出:

enter image description here

编辑:用户输入时

textField事件

添加目标editingDidChange
textField.addTarget(self, action: #selector(textFieldEdidtingDidChange(_ :)), for: UIControlEvents.editingChanged)

以下是用户输入时如何提供空间。

@objc func textFieldEdidtingDidChange(_ textField :UITextField) {
    let attributedString = NSMutableAttributedString(string: textField.text!)
    attributedString.addAttribute(NSAttributedStringKey.kern, value: CGFloat(8.0), range: NSRange(location: 0, length: attributedString.length))
    textField.attributedText = attributedString
}

<强>输出:

enter image description here

编辑:2

  

在分析了@kuldeep提供的演示项目后,如果我们使用secureTextEntry(系统除外),customFont似乎无效。我尝试使用systemFont并且它可以工作,如果我们取消选中secureTextEntry,它也适用于所有字体。

我不知道为什么在这种情况下间距不起作用,但我想出了以下解决方案:

我不会使用secureTextEntry而是替换editingChange事件中的所有字符。所以我创建了一个自定义类:

class PasswordField: TextFieldCustomize {
    var originalText: String? /// Your original text
    var customChar = "•" /// Custom character to replace with original character while typing
}
/// TextFieldCustomize is a custom class I found in demo project.

以下是editingChange:

的更新方法
@objc func textFieldEdidtingDidChange(_ textField :UITextField) {

    var string = textField.text;
    if let passwordField = textField as? PasswordField {
       /// Replace all the characters by custom character •
       var newString = ""
       let count = string?.characters.count ?? 0
       for i in 0..<count {
            if i == count - 1 {
                let lastChar = string!.characters.last!
                newString.append(lastChar)
            }
            else {
                newString.append(passwordField.customChar)
            }
       }
       string = newString

        /// This will be your original text, So use passwordField.originalText instead of passwordField.text when needed
         passwordField.originalText = textField.text
     }

     let attributedString = NSMutableAttributedString(string: string!)
     attributedString.addAttribute(NSAttributedStringKey.kern, value: CGFloat(8.0), range: NSRange(location: 0, length: attributedString.length))
     textField.attributedText = attributedString
}

答案 1 :(得分:1)

对于占位符,您应该这样做,

let attributedString = NSMutableAttributedString(string: txtField.placeholder!)
attributedString.addAttribute(NSAttributedStringKey.kern, value: CGFloat(8.0), range: NSRange(location: 0, length: attributedString.length))
txtField.attributedPlaceholder = attributedString

如果您尚未在storyboard中设置占位符文字,那么您还应在调用上述代码段之前设置其值,

txtField.placeholder = "Developer"

答案 2 :(得分:0)

如果你想在TextField中使用左边填充只是使用下面的代码,它会在左边添加填充以及占位符和文本

txtField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);

您可以通过更改第一个参数的值来更改左边距的数量。

修改

如果您想在字符之间留出空格,为什么不使用attributedPlaceholder属性?我使用attributedPlaceholder尝试了您的代码,效果非常好。

let attributedString = NSMutableAttributedString(string: "Developer")
attributedString.addAttribute(NSAttributedStringKey.kern, value: CGFloat(8.0), range: NSRange(location: 0, length: attributedString.length))
txtField.attributedPlaceholder = attributedString