使用自定义字体时,带有secureTextEntry的UITextField中的项目符号大小会随着焦点切换而改变大小

时间:2013-12-18 03:48:13

标签: ios objective-c fonts uitextfield

我有UITextField使用Museo Sans Rounded 300字体。一切都适用于普通的UITextFields,但是当你设置secureTextEntry = YES时,随着UITextField获得并失去焦点(即成为并放弃,成为第一个响应者),子弹的大小就会出现令人不安的变化。 / p>

UITextField具有焦点时,子弹似乎使用自定义字体,但一旦失去焦点,它们就会变为更大(标准尺寸)的子弹。

5 个答案:

答案 0 :(得分:5)

所以,我找到解决这个问题的唯一方法是使用textFieldDidBeginEditingtextFieldDidEndEditing委托方法,跟踪文本字段中输入的内容,用子弹掩码替换它,并禁用secureTextEntry。因此,当他们离开战场时,他们实际上只是看到正确数量的子弹,而不是他们的安全文本。它既黑又乱,但它也适合我,也许也适合你。

答案 1 :(得分:4)

我找到了一个简单的解决方案,它的效果非常好。 当您将secureTextEntry设置为yes时,基本上您必须将字体更改为自定义字体。

- (void)textFieldDidBeginEditing:(UITextField *)textField{

    if([textField.text isEqual:@"Password"]){
        textField.text = @"";
        textField.font = [UIFont fontWithName:@"Helvetica" size:14.5];
        textField.secureTextEntry = YES;
    }
}

- (void)textFieldDidEndEditing:(UITextField *)textField{

    if([textField.text isEqual:@""]){
        textField.text = @"Password";
        textField.secureTextEntry = NO;
        textField.font = [UIFont fontWithName:@"YourFont" size:14.5];
    }
}

答案 2 :(得分:2)

另一种解决方法:

虽然这是一个iOS错误(在iOS 7中是新的,我应该添加),但我确实有另一种方法来解决它可能会被接受的问题。功能仍然略有下降但不是很多。

基本上,只要字段中输入了某些内容,就可以将字体设置为默认字体系列/样式;但是当没有输入任何内容时,请将其设置为自定义字体。 (字体大小可以单独留下,因为它是系列/样式,而不是大小,有缺陷。)捕获字段值的每次更改并在此时相应地设置字体。然后,当没有输入任何内容时,微弱的“提示”文本具有您想要的字体(自定义);但是当输入任何内容时(无论您是否正在编辑)都将使用默认值(Helvetica)。由于子弹是子弹,这应该看起来不错。

一个缺点是,在被项目符号替换之前输入的字符将使用默认字体(Helvetica)。这只是每个角色的瞬间。如果这是可以接受的,那么这个解决方案就可以了。

答案 3 :(得分:2)

我只是测试上面的结果,@ Javier Peigneux的答案是最简洁的

#pragma mark -- UITextFieldDelegate

- (void)textFieldDidBeginEditing:(UCSSafeTF *)safeTF{

    safeTF.font = [UIFont fontWithName:@"Helvetica" size:14];
}

- (void)textFieldDidEndEditing:(UCSSafeTF *)safeTF{

    safeTF.font = [UIFont fontWithName:@"Helvetica" size:14];
}

现在我这样写,结果还可以。那你之所以看到子弹尺寸从小到大变化的原因很明显,只是因为苹果iOS 10以下"帮助"我们调整自定义字体的大小。希望对你有所帮助。

答案 4 :(得分:0)

只需创建一个每次选择显示/隐藏密码切换时都会调用的方法。在方法内部,将字体设置为nil,然后将字体设置为自定义字体和字体大小。您也应该在viewWillAppear方法中设置自定义字体和大小。在此方法中,您将重新设置它。

这样,您无需停用secureTextEntry (这可能会使您的文字字段容易受到攻击),而您无需使用textFieldDidBeginEditing或{{ 1}}。

代码示例:

textFieldDidEndEditing