gpt4 book ai didi

ios - 如何实现占位符文本在 UITextField 中逐字符消失

转载 作者:IT王子 更新时间:2023-10-29 08:06:41 26 4
gpt4 key购买 nike

你能帮帮我吗

UITextField 中,当我们提供占位符文本时,当我们输入任何字符时,其占位符字符串将消失。我怎样才能实现只输入的字符而不是完整的字符串?这意味着如果我输入 3 个字符,只有占位符的前 3 个字符会消失。

enter image description here

#编辑 1

另外,新输入的字 rune 字颜色会发生变化,其余字符的文字颜色保持不变。

提前致谢。

最佳答案

我不相信占位符的默认行为是可编辑的,但您可以使用 NSAttributedString 模拟占位符值来完成您想要完成的操作。

我确信这可以优化,但我在这里创建了一个处理程序类,它充当给定 UITextField 的委托(delegate),处理用户输入的字符串以实现所需的效果。您使用所需的占位符字符串初始化处理程序,因此您可以使任何文本字段以这种方式工作。

Custom Placeholder Text Field

import UIKit

class CustomPlaceholderTextFieldHandler: NSObject {
let placeholderText: String
let placeholderAttributes = [NSForegroundColorAttributeName : UIColor.lightGray]
let inputAttributes = [NSForegroundColorAttributeName : UIColor(red: 255/255, green: 153/255, blue: 0, alpha: 1.0)]
var input = ""

init(placeholder: String) {
self.placeholderText = placeholder
super.init()
}

func resetPlaceholder(for textField: UITextField) {
input = ""
setCombinedText(for: textField)
}

fileprivate func setCursorPosition(for textField: UITextField) {
guard let cursorPosition = textField.position(from: textField.beginningOfDocument, offset: input.characters.count)
else { return }

textField.selectedTextRange = textField.textRange(from: cursorPosition, to: cursorPosition)
}

fileprivate func setCombinedText(for textField: UITextField) {
let placeholderSubstring = placeholderText.substring(from: input.endIndex)
let attributedString = NSMutableAttributedString(string: input + placeholderSubstring, attributes: placeholderAttributes)
attributedString.addAttributes(inputAttributes, range: NSMakeRange(0, input.characters.count))
textField.attributedText = attributedString
}
}

extension CustomPlaceholderTextFieldHandler: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

if string == "" {
if input.characters.count > 0 {
input = input.substring(to: input.index(before: input.endIndex))
}
} else {
input += string
}

if input.characters.count <= placeholderText.characters.count {
setCombinedText(for: textField)
setCursorPosition(for: textField)
return false
}
return true
}

func textFieldDidBeginEditing(_ textField: UITextField) {
setCursorPosition(for: textField)
}
}

下面是我初始化上面 gif 的方法:

class ViewController: UIViewController {

@IBOutlet weak var textField: UITextField!
let placeholderHandler = CustomPlaceholderTextFieldHandler(placeholder: "_2_-__-__A")

override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = placeholderHandler
placeholderHandler.resetPlaceholder(for: textField)
}
}

这可以扩展为在初始化时获取颜色参数、字体等,或者您可能会发现将 UITextField 子类化并使其成为自己的委托(delegate)会更简洁。我也没有真正测试过选择/删除/替换多个字符。

input 变量将返回用户在任何给定点输入的文本。此外,使用固定宽度的字体会消除用户键入时的抖动并替换占位符文本。

关于ios - 如何实现占位符文本在 UITextField 中逐字符消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46048634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com