27

我创建了一个简单的项目:https ://github.com/edzio27/textFieldExample.git

我在其中添加了两个UITextFields,一个带有登录名,第二个带有安全密码。我注意到有奇怪的行为:

  1. 点击登录并添加一些文字,
  2. 点击密码并添加一些文字,
  3. 再次点击登录UITextField

在此处输入图像描述

请注意,密码字体大小有一个奇怪的行为。它只出现在 iOS7 中。

可能是什么问题?

谢谢。

4

5 回答 5

22

正如一些人指出的那样,安全文本字段似乎并不总是能很好地与自定义字体配合使用。我通过使用 UITextFieldUIControlEventEditingChanged来监视文本字段的更改并在输入任何内容时将其设置为系统字体(具有正常外观的项目符号点)来解决此问题,否则使用我的自定义字体。

这使我可以继续使用我的自定义字体作为文本字段占位符,并且在输入密码时仍然看起来不错。输入时一次显示一个的字符将是系统字体,但我可以接受。

在 viewDidLoad 中:

[self.passwordTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

现在添加一个 textFieldDidChange 方法:

- (void)textFieldDidChange:(id)sender
{
    UITextField *textField = (UITextField *)sender;

    if (textField == self.passwordTextField) {
        // Set to custom font if the textfield is cleared, else set it to system font
        // This is a workaround because secure text fields don't play well with custom fonts
        if (textField.text.length == 0) {
            textField.font = [UIFont fontWithName:@"OpenSans" size:textField.font.pointSize];
        }
        else {
            textField.font = [UIFont systemFontOfSize:textField.font.pointSize];
        }
    }
}
于 2014-02-10T06:09:34.373 回答
17

使用自定义字体切换安全/不安全状态:为了显示“安全”文本(blob 字符),包含 blob 字符的字体由 iOS 设置。这是您稍后在切换到不安全模式时看到的呈现文本的字体。

尽管文本字段保留了您分配的自定义字体,但该字段的内容是一个属性字符串,它引用了包含 blob 的字体。

简单的解决方案:写入属性字符串字段,然后重新应用正确的自定义字体。

要关闭安全输入并保留自定义字体:

passwordTextField.secureTextEntry = false

// We have to remove iOS' secure font by setting attributedText.
let pwd = passwordTextField.text!
passwordTextField.attributedText = NSAttributedString(string: pwd)
于 2016-03-14T21:17:00.917 回答
4

如果您在密码字段中关闭“调整为适合”,它将在您辞职响应者时停止调整大小。

于 2013-10-20T10:18:58.543 回答
1

设置您的 TextField 代表并添加它;

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (!textField.secureTextEntry) {
        return YES;
    }

    textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string];

    if (textField.text.length > 0) {
        textField.font = [UIFont systemFontOfSize:18.0f];
    } else {
        textField.font = [UIFont fontWithName:@"YourFont" size:18.0f];
    }

    return NO;
}
于 2014-08-12T08:20:53.227 回答
0

检查这个: UITextField secureTextEntry bullets with a custom font?

glyuck有一个我喜欢 的优雅解决方案。http://github.com/elegion/ELFixSecureTextFieldFont 他在 UITextField 上创建了一个类别。要很好地显示点,您必须包含 ELFixSecureTextFieldFont.h 和 .m 文件,然后在您的 textField 上调用 - (void)fixSecureTextFieldFont,如下所示:

[yourCustomSecureTextField fixSecureTextFieldFont];

这就对了。

于 2014-04-23T14:52:11.613 回答