我使用 Swift 和 UIKit 编写了一个应用程序(主要是程序化的,很少甚至没有故事板),目前它的主题始终是黑暗的。这在我的“创建帐户”页面上提出了一个问题。我有使用黑色背景和灰色文本的文本字段,我希望用户能够使用 Apple 的强密码建议选项,但问题是,每当它以黄色/黄绿色-y 颜色突出显示该字段时,文本不再清晰可辨。 (浅灰色+黄绿色=糟糕的组合)
我最初的想法是确定何时显示强密码建议,然后更改文本颜色直到其被忽略,但我不确定如何去做。我在App Store上看到过其他应用程序,比如Yoto,这个文字颜色会改变,所以它必须是可能的,对吧?
(我知道更改文本框颜色可以解决问题,但它看起来像屁股,并且背叛了我已经围绕应用程序的整个其余部分所做的主题)
是的,当显示强密码建议时,绝对可以更改文本颜色。这里的关键是观察密码自动填充 UI 何时出现,然后相应地调整文本颜色。
以下是您可以采取的一般方法:
观察文本字段编辑事件: 您可以使用 UITextFieldDelegate 方法来观察文本字段何时被编辑。具体来说,您需要观察文本字段何时变为活动状态 (textFieldDidBeginEditing) 以及何时结束编辑 (textFieldDidEndEditing)。
检测强密码自动填充: 没有直接的 API 可以检测何时显示强密码建议,但您可以通过检查文本字段的文本输入特征来推断。通常建议在安全文本输入字段中使用强密码,并且您可以监视文本更改。
更改文本颜色: 当文本字段处于活动状态并且可能会显示自动填充 UI 时,将文本颜色更改为在黄绿色/黄色背景下更易读的颜色。用户完成编辑后恢复文本颜色。
这里有一些示例代码来演示这一点:
class YourViewController: UIViewController, UITextFieldDelegate {
let passwordTextField: UITextField = {
let textField = UITextField()
textField.translatesAutoresizingMaskIntoConstraints = false
textField.isSecureTextEntry = true
textField.backgroundColor = .black
textField.textColor = .lightGray
return textField
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(passwordTextField)
passwordTextField.delegate = self
// Layout the textField
NSLayoutConstraint.activate([
passwordTextField.centerXAnchor.constraint(equalTo: view.centerXAnchor),
passwordTextField.centerYAnchor.constraint(equalTo: view.centerYAnchor),
passwordTextField.widthAnchor.constraint(equalToConstant: 200),
passwordTextField.heightAnchor.constraint(equalToConstant: 40)
])
}
func textFieldDidBeginEditing(_ textField: UITextField) {
// Check if it's the password field and change text color
if textField == passwordTextField {
textField.textColor = .white
}
}
func textFieldDidEndEditing(_ textField: UITextField) {
// Revert text color when editing ends
if textField == passwordTextField {
textField.textColor = .lightGray
}
}
}
但是,对于大多数用例,只需在文本字段处于活动状态时调整文本颜色即可获得所需的效果。
额外考虑因素: 如果您发现调整文本颜色不够或太刺耳,您还可以考虑在密码自动填充处于活动状态时进行微妙的背景更改或叠加效果,尽管这需要仔细完成以保持深色主题。