具有自定义字体的UITextField secureTextEntry项目符号?

我在UITextField使用了一个自定义字体,它已经打开了secureTextEntry 。 当我在单元格中input内容时,我看到了所选字体中的子弹,但是当该字段失去焦点时,这些子弹将恢复为系统标准字体。 如果我再次点击该字段,它们会变回我的字体,依此类推。

有没有一种方法可以确保他们继续显示自定义字体的项目符号,即使该字段没有对焦?

在这里输入图像说明在这里输入图像说明

一个解决这个问题的子类。 创build一个任意的UITextField ,然后将secure属性设置为YES (通过IB中的KVC)。

实际上它实现了lukech提出的评论 。 当文本字段结束编辑时,它切换到任意文本字段,然后设置大量的点, text访问器中的一些黑客总是得到实际文本的字段。

 @interface SecureTextFieldWithCustomFont : UITextField @property (nonatomic) BOOL secure; @property (nonatomic, strong) NSString *actualText; @end @implementation SecureTextFieldWithCustomFont -(void)awakeFromNib { [super awakeFromNib]; if (self.secureTextEntry) { // Listen for changes. [self addTarget:self action:@selector(editingDidBegin) forControlEvents:UIControlEventEditingDidBegin]; [self addTarget:self action:@selector(editingDidChange) forControlEvents:UIControlEventEditingChanged]; [self addTarget:self action:@selector(editingDidFinish) forControlEvents:UIControlEventEditingDidEnd]; } } -(NSString*)text { if (self.editing || self.secure == NO) { return [super text]; } else { return self.actualText; } } -(void)editingDidBegin { self.secureTextEntry = YES; self.text = self.actualText; } -(void)editingDidChange { self.actualText = self.text; } -(void)editingDidFinish { self.secureTextEntry = NO; self.actualText = self.text; self.text = [self dotPlaceholder]; } -(NSString*)dotPlaceholder { int index = 0; NSMutableString *dots = @"".mutableCopy; while (index < self.text.length) { [dots appendString:@"•"]; index++; } return dots; } @end 

可能会增加与非NIB实例化,处理默认值等,但你可能会明白。

对于那些在切换secureTextEntry时遇到丢失自定义字体的问题,我find了解决办法(我正在使用iOS 8.4 SDK)。 我试图在UITextField中显示/隐藏密码。 每当我切换secureTextEntry = NO我的自定义字体得到borked,只有最后一个字符显示正确的字体。 一些时髦的事情肯定会继续下去,但这是我的解决scheme:

 -(void)showPassword { [self.textField resignFirstResponder]; self.textField.secureTextEntry = NO; } 

第一响应者因某种原因需要辞职。 在将secureTextEntry设置为YES时,您似乎不需要退出第一个响应者,只有在设置为NO时才需要退出。

实际的问题似乎是编辑视图( UITextField在编辑时没有绘制自己的文本)使用项目符号(U + 2022)绘制编辑字符,而UITextField使用黑色圆圈(U + 25CF)。 我想在默认的字体中,这些字符看起来是一样的。

这里有一个替代解决scheme,对于任何感兴趣的人来说,它使用自定义的文本字段子类,但不需要处理文本属性或其他特殊configuration。 海事组织,这使得事情相对干净。

 @interface MyTextField : UITextField @end @implementation MyTextField - (void)drawTextInRect:(CGRect)rect { if (self.isSecureTextEntry) { NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new]; paragraphStyle.alignment = self.textAlignment; NSMutableDictionary *attributes = [NSMutableDictionary dictionary]; [attributes setValue:self.font forKey:NSFontAttributeName]; [attributes setValue:self.textColor forKey:NSForegroundColorAttributeName]; [attributes setValue:paragraphStyle forKey:NSParagraphStyleAttributeName]; CGSize textSize = [self.text sizeWithAttributes:attributes]; rect = CGRectInset(rect, 0, (CGRectGetHeight(rect) - textSize.height) * 0.5); rect.origin.y = floorf(rect.origin.y); NSMutableString *redactedText = [NSMutableString new]; while (redactedText.length < self.text.length) { [redactedText appendString:@"\u2022"]; } [redactedText drawInRect:rect withAttributes:attributes]; } else { [super drawTextInRect:rect]; } } @end 

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

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

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

我发现这个问题的一个窍门。

 - (void)textFieldDidBeginEditing:(UITextField *)textField { if ([textField tag]== TAG_PASS || [textField tag]== TAG_CPASS) { // To fix password dot size if ([[textField text] isEqualToString:@"" ]) { [textField setText:@" "]; [textField resignFirstResponder]; [textField becomeFirstResponder]; [textField setText:@""]; } } } 
 [passWordTextField resignFirstResponder]; passWordTextField.secureTextEntry = !passWordTextField.secureTextEntry; [passWordTextField becomeFirstResponder]; 

这是解决这个bug的最快方法!

对于自定义字体,iOS有点奇怪。 尝试删除“调整为适合该文本字段”。 如果这不起作用,我猜测是什么困扰你是字体的大小增加。

一个简单的解决scheme是:

 - (void)textFieldDidBeginEditing:(UITextField *)textField { if(textField.secureTextEntry) { [textField setFont:[UIFont fontWithName:@"Helvetica-Bold" size:10.0]]; } } -(void)textFieldDidEndEditing:(UITextField *)textField { if(textField.secureTextEntry) { [textField setFont:[UIFont fontWithName:@"Helvetica-Bold" size:10.0]]; } } 

您需要稍微玩一下这个尺寸,以便在丢失对UITextField焦点时看起来没有尺寸变化。

如果你在编辑的问题中的字符之间有一个很大的间距问题,最简单(也有点难看)的解决scheme是创build一个符合上述尺寸和间距的Bullet图像,并匹配用户input的字符数量当用户离开UITextField时出现。

一个secureTextEntry文本字段可以完全避免:

 NSString *pin = @""; BOOL pasting = FALSE; -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if(!pasting) { pin = [pin stringByReplacingCharactersInRange:range withString:string]; // Bail out when deleting a character if([string length] == 0) { return YES; } pasting = TRUE; [textField paste:@"●"]; return NO; } else { pasting = FALSE; return YES; } } 

我build议resignFirstResponder,然后再更改scureTextEntry,然后再次成为FirstResponder,因为它是张贴在这里: https ://stackoverflow.com/a/34777286/1151916