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

Posted

技术标签:

【中文标题】如何在 UITextField 占位符字符之间添加空格?【英文标题】:How to add space between UITextField Placeholder characters? 【发布时间】:2018-09-29 23:50:12 【问题描述】:

我想在 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 可以安全进入。当我在 textField 中键入任何内容时,txtField.attributedText未应用字符之间的空格。

没有安全字段

使用安全字段

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

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

提前致谢。

【问题讨论】:

你为什么不用attributedPlaceholder 因为我还想在占位符中的字符之间添加空格。 你的代码的输出是什么? 在我的问题中添加的代码对于字符之间的空格可以正常工作。但在将此代码用于attributedPlaceholder 时遇到错误。 具有文本的安全输入字段,其他文件具有占位符。 【参考方案1】:

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

所以改变

txtField.attributedText = attributedString

textField.attributedPlaceholder = attributedString

下面是输出:

编辑:当用户输入时

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

输出:

编辑:2

分析@kuldeep 提供的演示项目后,如果我们使用customFont(系统除外),似乎secureTextEntry 不起作用。我尝试使用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 个password 提交给secure entry,在该字段中txtField.attributedText 不起作用。 @Kuldeep 请在您的问题中更新此内容,以便我们做出相应的回答。 @Kuldeep 您想要文本中的空间(当用户输入时)或占位符? 1. UsernamePassword textField placeHolder 间距完成 2. @ 987654351@ text (当用户正在输入或完成输入后)完成 3 Password text (当用户正在输入或完成输入后)不工作 您是如何为Username text (when user is typing or after finish typing) is done 做到这一点的? securetext 没有区别,应该可以。【参考方案2】:

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

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中设置占位符文本那么你也应该在调用上面的sn-p之前设置它的值,

txtField.placeholder = "Developer"

【讨论】:

【参考方案3】:

如果您想在 TextField 中使用左填充,只需使用以下代码,它将在左侧添加填充以用于占位符以及文本

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

你可以通过改变 at first argument 的值来改变左边的填充量。

编辑

如果你想要字符之间的空间,为什么不使用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

【讨论】:

此代码仅在占位符之间添加前导空格,但我想在 textField 每个字符之间添加空格。假设 textField 文本是 Developer 而不是我想要的 D e v e l o p e r 你为什么不用attributedPlaceholder

以上是关于如何在 UITextField 占位符字符之间添加空格?的主要内容,如果未能解决你的问题,请参考以下文章

将占位符添加到 UITextField,如何以编程方式快速设置占位符文本?

UITextField 占位符颜色

在 UITextField 占位符中输入文本时,应一次消失一个字母

UITextField 占位符对齐滚动问题

在 UITextField 中键入时保持占位符静态

如何移动/动画 UITextField 占位符文本