I’m using a custom font in a UITextField
, which has secureTextEntry
turned on. When I’m typing in the cell, I see the bullets in my chosen font, but when the field loses focus, those bullets revert to the system standard font. If I tap the field again, they change back to my font, and so on.
Is there a way I can ensure that they continue to display the custom font’s bullets, even when the field is out of focus?
A subclass that works this issue around. Create an arbitrary UITextField
, then set the secure
property to YES
(via KVC in IB).
Actually it implements a comment suggested by lukech. When textfield ends editing, it switches to an arbitrary textfield, then set a bulk of dots into, and some hack in text
accessor to always get the actual text the field holds.
@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
May be augmented to work with non NIB instantiations, handling default values, etc, but you probably get the idea.
For those having trouble with losing custom fonts when toggling secureTextEntry, I found a work-around (I'm using the iOS 8.4 SDK). I was trying to make a toggle for showing/hiding a password in a UITextField. Every time I'd toggle secureTextEntry = NO
my custom font got borked, and only the last character showed the correct font. Something funky is definitely going on with this, but here's my solution:
-(void)showPassword { [self.textField resignFirstResponder]; self.textField.secureTextEntry = NO; }
First responder needs to be resigned for some reason. You don't seem to need to resign the first responder when setting secureTextEntry to YES, only when setting to NO.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With