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

我有一个使用Museo Sans Rounded 300字体的UITextField 。 一切工作正常的UITextFields,但是当你设置secureTextEntry = YES ,那么这是令人不安的变化,因为UITextField获取和失去焦点(即变成,并放弃,作为第一响应者)的项目符号的大小。

UITextField具有焦点时,项目符号似乎使用自定义字体,但一旦失去焦点,它们将变成这些更大(标准尺寸)的项目符号。

所以,我发现与之对抗的唯一方法是使用textFieldDidBeginEditingtextFieldDidEndEditing委托方法,跟踪在文本字段中input的内容,将其replace为项目符号掩码,并禁用secureTextEntry 。 所以,当他们离开这个领域的时候,他们实际上只是看到了正确数量的子弹,而不是他们的安全文字。 这是hacky和凌乱,但它会为我做,也许为你。

我发现一个简单的解决scheme,它工作得很好。 基本上你必须改变字体为自定义字体,当你把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]; } } 

另一个解决方法:

虽然这是一个iOS错误(在iOS 7中是新增function,我应该添加),但我还有另外一种方法可以解决这个问题,那就是可以接受的。 function仍然略有降低,但不是太多。

基本上,这个想法是设置字体为默认的字体家族/风格,只要字段中有东西input; 但是当没有input时,将其设置为您的自定义字体。 (字体大小可以单独保留,因为它是家庭/风格,而不是大小,这是越野车。)陷阱的每一个字段的值的变化,并在那个时候相应地设置字体。 然后,当没有input时,模糊的“提示”文本有你想要的字体(自定义); 但是当input任何东西(不pipe你是否正在编辑)都将使用默认(Helvetica)。 由于子弹是子弹,这应该看起来不错。

其中一个缺点是,在你被子弹取代之前,你所键入的字符会使用默认字体(Helvetica)。 这只是每个angular色的一秒钟。 如果这是可以接受的,那么这个解决scheme的作品

我刚刚testing结果如上,@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]; } 

现在我这样写,结果是OK。 那么你看到子弹大小从小到大的原因很明显,只是因为苹果iOS 10下面的“帮助”我们调整了自定义字体。 希望能帮助你。

只要创build一个方法,每次select显示/隐藏密码切换时都会被调用。 在该方法中,将字体设置为零,然后将字体设置为您的自定义字体和字体大小。 您应该在viewWillAppear方法中设置自定义字体和大小。 在这个方法里面,你正在重新设置它。

这样,您不需要禁用secureTextEntry (这可能会使您的文本字段易受攻击),并且不需要使用textFieldDidBeginEditingtextFieldDidEndEditing

代码示例:

 //if the password is obscured and the toggle to show it has been turned on, display password. Else, obscure it. - (IBAction)togglePasswordVisibility:(id)sender { // Xcode contains a bug where the font changes to default font if these two lines of code are not included. self.passwordInputTextField.font = nil; self.passwordInputTextField.font = [UIFont fontWithName:@"myCustomFontName" size:myDesiredFontSize]; //set this in viewWillAppear as well! if (self.passwordInputTextField.secureTextEntry == YES) { self.passwordInputTextField.secureTextEntry = NO; [self.showHideButton setTitle:@"HIDE" forState:UIControlStateNormal]; } else { self.passwordInputTextField.secureTextEntry = YES; [self.showHideButton setTitle:@"SHOW" forState:UIControlStateNormal]; } }