it-swarm.com.de

UITextField secureTextEntry Aufzählungszeichen mit einer benutzerdefinierten Schriftart?

Ich verwende eine benutzerdefinierte Schriftart in einer UITextField, die secureTextEntry aktiviert hat. Wenn ich in die Zelle tippe, sehe ich die Aufzählungszeichen in der von Ihnen gewählten Schriftart, aber wenn das Feld den Fokus verliert, werden diese Aufzählungszeichen auf die Standardschriftart des Systems zurückgesetzt. Wenn ich erneut auf das Feld tippe, ändern sie sich wieder in meine Schriftart und so weiter.

Gibt es eine Möglichkeit, sicherzustellen, dass die Aufzählungszeichen der benutzerdefinierten Schriftart auch dann angezeigt werden, wenn das Feld unscharf ist?

enter image description hereenter image description here

39
Luke

Eine Unterklasse, die dieses Problem behandelt. Erstellen Sie eine beliebige UITextField und setzen Sie dann die secure-Eigenschaft auf YES (über KVC in IB).

Tatsächlich wird ein von lukech vorgeschlagener Kommentar implementiert. Wenn das Bearbeiten des Textfelds beendet ist, wird zu einem beliebigen Textfeld gewechselt. Dann wird ein Großteil der Punkte gesetzt und in text Zugriff gehackt, um immer den tatsächlichen Text des Felds zu erhalten.

@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

Möglicherweise erweitert, um mit Nicht-NIB-Instantiierungen zu arbeiten, mit Standardwerten usw. umzugehen, aber Sie haben wahrscheinlich die Idee.

17
Geri

Für diejenigen, die Probleme mit dem Verlust von benutzerdefinierten Schriftarten beim Umschalten von secureTextEntry haben, fand ich eine Problemumgehung (Ich verwende das iOS 8.4 SDK). Ich habe versucht, eine Option zum Anzeigen/Ausblenden eines Kennworts in einem UITextField zu aktivieren. Jedes Mal, wenn ich secureTextEntry = NO umschalte, wurde meine eigene Schriftart verzerrt und nur das letzte Zeichen zeigte die richtige Schriftart. Es ist definitiv etwas Irres dabei, aber hier ist meine Lösung:

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

Der Ersthelfer muss aus irgendeinem Grund zurückgetreten werden. Sie müssen den ersten Responder nicht zu resignieren, wenn Sie secureTextEntry auf YES setzen, nur wenn Sie auf NO setzen.

11
Joshua Haines

Das eigentliche Problem scheint zu sein, dass die Bearbeitungsansicht (UITextFieldnicht während der Bearbeitung einen eigenen Text zeichnet) zur Verwendung von Aufzählungszeichen (U + 2022) zum Zeichnen von redigierten Zeichen und UITextField schwarze Kreise (U + 25CF) verwendet. Ich nehme an, dass diese Zeichen in den Standardschriftarten gleich aussehen.

Hier ist eine alternative Problemumgehung für alle Interessierten, die eine benutzerdefinierte Unterkategorie für Textfelder verwendet, jedoch kein Jonglieren mit der Texteigenschaft oder einer anderen speziellen Konfiguration erforderlich ist. IMO, das hält die Dinge relativ sauber.

@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
9
Austin

Dies ist zwar ein iOS-Bug (und neu in iOS 7, sollte ich hinzufügen), aber ich habe eine andere Möglichkeit, es zu umgehen, die man für akzeptabel halten könnte. Die Funktionalität ist immer noch etwas beeinträchtigt, aber nicht viel. 

Grundsätzlich besteht die Idee darin, die Schriftart auf die Standardfamilie/den Standardstil zu setzen, wenn in das Feld etwas eingetragen wird. Wenn jedoch nichts eingegeben wird, stellen Sie die benutzerdefinierte Schriftart ein. (Die Schriftgröße kann in Ruhe gelassen werden, da es sich um die Familie/den Stil handelt, nicht um die Größe, die fehlerhaft ist.) Fangen Sie jede Änderung des Feldwerts ein und stellen Sie die Schriftart zu diesem Zeitpunkt entsprechend ein. Dann hat der schwache "Hinweis" -Text, wenn nichts eingegeben wird, die gewünschte Schriftart (benutzerdefiniert); Wenn jedoch etwas eingegeben wird (egal ob Sie bearbeiten oder nicht), wird default (Helvetica) verwendet. Da Kugeln Kugeln sind, sollte dies gut aussehen.

Der einzige Nachteil ist, dass die Zeichen, die Sie eingeben, bevor sie durch Aufzählungszeichen ersetzt werden, die Standardschriftart (Helvetica) verwenden. Das ist jedoch nur für einen Bruchteil einer Sekunde pro Zeichen. Wenn das akzeptabel ist, funktioniert diese Lösung.

3
RedRedSuit
[passWordTextField resignFirstResponder];
passWordTextField.secureTextEntry = !passWordTextField.secureTextEntry;
[passWordTextField becomeFirstResponder];

Dies ist der schnellste Weg, um diesen Fehler zu beheben.

1
AaronTKD

Ich habe einen Trick für dieses Problem gefunden.

- (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:@""];
        }  
    }
}
1

Ein secureTextEntry-Textfeld kann vollständig vermieden werden:

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;
    }
}
0
Randomblue

iOS verhält sich etwas seltsam, wenn es um benutzerdefinierte Schriftarten geht. Entfernen Sie "Anpassen" für dieses Textfeld. Wenn das nicht klappt, schätze ich, dass Sie die Größe der Schrift vergrößern.

Eine einfache Lösung dafür wäre:

- (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]];
    }
}

Sie müssen etwas mit der Größe spielen, damit sie so aussieht, als ob keine Größenänderung erfolgt, wenn Sie den Fokus auf UITextField verlieren.

Wenn Sie ein großes Abstandsproblem zwischen Zeichen wie in der bearbeiteten Frage haben, besteht die einfachste (und etwas hässliche) Lösung darin, ein Aufzählungsbild zu erstellen, das der obigen Größe und dem Abstand entspricht und der vom Benutzer eingegebenen Anzahl von Zeichen entspricht erscheint, wenn der Benutzer UITextField verlässt.

0
Segev

Ich empfehle vor dem Ändern von scureTextEntry den resignFirstResponder erneut zu verwenden und dann erneutFirstResponder zu werden, da er hier veröffentlicht wird: https://stackoverflow.com/a/34777286/1151916

0
Ramis