如何在 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. Username
和 Password
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,如何以编程方式快速设置占位符文本?