在iOS7中更改安全UITextField奇怪行为中的UIFont

时间:2013-10-20 09:36:57

标签: ios objective-c passwords ios7 uitextfield

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

我添加了两个UITextField,一个用于登录,另一个用安全密码。我注意到了一些奇怪的行为:

  1. 点击登录并添加一些文字,
  2. 点击密码并添加一些文字,
  3. 再次点击以登录UITextField
  4. enter image description here

    请注意,密码字体大小存在奇怪的行为。它仅出现在iOS7中。

    可能是什么问题?

    感谢。

5 个答案:

答案 0 :(得分: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];
        }
    }
}

答案 1 :(得分:17)

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

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

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

关闭安全进入&保留自定义字体:

       // Configure CocoaLumberjack
        DDLog.addLogger(DDASLLogger.sharedInstance())
        DDLog.addLogger(DDTTYLogger.sharedInstance())
        // Initialize File Logger
        let manager : BaseLogFileManager = BaseLogFileManager(logsDirectory:K.LogFileDir)
        let fileLogger: DDFileLogger = DDFileLogger(logFileManager: manager) // File Logger
        do {
                let attr : NSDictionary? = try NSFileManager.defaultManager().attributesOfItemAtPath(K.LogFileDir+"/"+K.LogFileName)
                if let _attr = attr {
                    if _attr.fileSize() > 1024*1024*10
                    {
                        NSFileManager.defaultManager().createFileAtPath(K.LogFileDir+"/"+K.LogFileName, contents: NSData(), attributes: nil)
                    }
                }
            } catch {
                print("Error: \(error)")
            }
        fileLogger.doNotReuseLogFiles = false
        fileLogger.logFileManager.maximumNumberOfLogFiles = 1
        DDLog.addLogger(fileLogger)

答案 2 :(得分:2)

如果您在密码字段中关闭“调整以适合”,则在您撤销响应者时将停止执行调整大小。

答案 3 :(得分: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;
}

答案 4 :(得分:0)

检查一下: UITextField secureTextEntry bullets with a custom font?

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

[yourCustomSecureTextField fixSecureTextFieldFont];

就是这样。