在iOS7中,更改安全UITextField中的UIFont表现异常

27

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

在该项目中,我添加了两个UITextField,一个用于登录,另一个用于输入安全密码。我注意到有一些奇怪的行为:

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

enter image description here

请注意,在iOS7中,密码字体大小出现了奇怪的问题。

问题可能是什么?

谢谢。


我遇到了相同的问题,但是当我返回并重新选择密码字段时,字体大小会恢复到较小的大小。因此,基本上,当该字段被选中时,字体较小,当选择另一个字段时,字体较大。 - Matt
我也遇到过这种情况。当我使用自定义字体时,它似乎表现不佳。 - Valerio
1
好的,对我来说问题实际上是自定义字体本身没有适当的“密码点”字符,但比标准的Helvetica小得多。 - Valerio
@bettola 你是如何解决的?使用不同的字体吗? - Kyle Clegg
@bettola 好的,我找到了一个解决办法,适合我的情况,并且允许我继续使用自定义字体。已添加为答案。 - Kyle Clegg
5个回答

22
作为一些人指出的,安全文本字段似乎不太适用于自定义字体。我通过使用UITextField的“UIControlEventEditingChanged”来监视文本字段的更改并在输入任何内容时将其设置为系统字体(具有正常外观的符号点),否则使用我的自定义字体来解决这个问题。
这使我可以继续使用自定义字体作为文本字段占位符,并在输入密码时仍然看起来很好。正在输入时显示一个接一个的字符将是系统字体,但我可以接受这样的结果。
在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];
        }
    }
}

17

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

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

简单的解决方案:将正确的、自定义的字体写入属性字符串字段即可重新应用。

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

passwordTextField.secureTextEntry = false

// We have to remove iOS' secure font by setting attributedText.
let pwd = passwordTextField.text!
passwordTextField.attributedText = NSAttributedString(string: pwd)

确实是所有解决方案中最清晰、最精准的。 - Benjamin

4
如果你在密码字段中关闭“自适应大小”选项,它将停止在重新注册响应器时调整大小。

对我也不起作用。我认为这是一个自定义字体的问题,因为我也在使用自定义字体。 - Zayin Krige
1
自定义字体有时会有非常有趣的基线。我在这里解决的问题仅适用于他链接的项目。至于自定义字体,在处理iOS时总是有点:/。 - David Wong
它在第一次切换安全文本输入为真和假时有效,但后来就不起作用了。 - Bibek

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;
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接