it-swarm.com.de

So legen Sie den Buchstabenabstand von UITextField fest

Ich habe eine App, in der der Benutzer einen vierstelligen PIN-Code eingeben muss. Alle Ziffern müssen einen bestimmten Abstand voneinander haben.

Gibt es eine Möglichkeit, dies zu tun, wenn die PinTextField eine Unterklasse von UIView ist? Ich weiß, in einer ViewController könnte man UITextFieldTextDidChangeNotification verwenden und den zugefügten Text für jede Änderung festlegen. Benachrichtigungen scheinen jedoch nicht in einer UIView zu funktionieren.

Ich habe mich auch gefragt, ob es keinen einfacheren Weg gibt, als für jedes Update einen Attribut-String zu erstellen, wenn Sie den Buchstabenabstand eines UITextField-Textes festlegen möchten.

Richtiger Abstand:

 TextField with correct spacing

Falscher Abstand:

 TextField with wrong spacing

31
KMV

Dies hat letztendlich dazu beigetragen, den Kern für jede Änderung festzulegen

    textField.addTarget(self, action: "textFieldDidChange", forControlEvents: .EditingChanged)

    func textFieldDidChange () {    
        let attributedString = NSMutableAttributedString(string: textField.text)
        attributedString.addAttribute(NSKernAttributeName, value: 5, range: NSMakeRange(0, count(textField.text)))
        attributedString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, count(textField.text)))
        attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blackColor(), range: NSMakeRange(0, count(textField.text)))

        textField.attributedText = attributedString
    }

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

        if count(textField.text) < 4 {
            return true
            // Else if 4 and delete is allowed
        }else if count(string) == 0 {
            return true
            // Else limit reached
        }else{
            return false
        }
    }

Das Problem bleibt jedoch bestehen, da unterschiedliche Zahlen unterschiedliche Breiten haben. Ich werde einfach darauf zurückkommen, für jede Ziffer eine UITextField zu machen.

8
KMV

AttributedText ist nicht notwendig, was, um ehrlich zu sein, eine Verwirrung mit modifizierten Abständen war. Sobald ich die Tastatur geschlossen hatte, verschwand der Abstand, was mich dazu veranlasste, weiter zu Dig. 

Jedes UITextField hat eine Eigenschaft namens defaultTextAttributes, die laut Apple "ein Wörterbuch mit Textattributen mit Standardwerten zurückgibt.". Das Apple-Dokument sagt außerdem, dass "diese Eigenschaft wendet die angegebenen Attribute auf den gesamten Text des Textfelds an" 

Suchen Sie einfach eine geeignete Stelle in Ihrem Code, normalerweise, wo das Textfeld initialisiert wird, und kopieren Sie dann das folgende.

In Swift 3.0 beantwortet 

textfield.defaultTextAttributes.updateValue(spacing, forKey: NSKernAttributeName)

der Abstand ist vom Typ CGFloat. Zum Beispiel 2.0

Dies funktioniert auch für verschiedene Schriftarten. 

Prost!!


Die neueste Syntax scheint zu sein:

 yourField.defaultTextAttributes.updateValue(36.0, 
     forKey: NSAttributedString.Key.kern)
24
iOSer

Verwenden Sie die defaultTextAttributes-Eigenschaft von UITextField. Es wird die Konvertierung in NSAttributedString für Sie übernehmen und die von Ihnen festgelegten Attribute anwenden. Zum Beispiel:

    NSMutableDictionary *attrs = [self.textField.defaultTextAttributes mutableCopy];
[attrs addEntriesFromDictionary:@{
    NSKernAttributeName: @18,
    NSUnderlineColorAttributeName: [UIColor grayColor],
    NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle | NSUnderlinePatternDash)
}];
self.textField.defaultTextAttributes = attrs;
3
Avi

Probieren Sie diesen Code aus Nachdem Sie den Stellvertreter auf das Textfeld gesetzt haben, kann es funktionieren.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:textField.text];
    [attributedString addAttribute:NSKernAttributeName
                             value:@(5.4)
                             range:NSMakeRange(0, textField.text.length)];
    textField.attributedText = attributedString;
    return YES;
}
0
Vishnuvardhan

Nicht wirklich sicher, was andere Lösungen angeht, anstatt die zugewiesene Zeichenfolge zu verwenden.

Für den Benachrichtigungsteil können Sie jedoch den Delegate textFields auf UIView setzen und die Methode unten in der Ansicht definieren. 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 

Die obige Methode wird jedes Mal aufgerufen, wenn sich der in das Textfeld eingegebene Text ändert.

0
Scarlet

Das funktioniert gut in Swift 2.2. Ich hoffe, dies wird Ihnen helfen, den Buchstabenabstand im Textfeld einzuhalten

override func viewDidLoad() {
 // Do any additional setup after loading the view.
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(SignupVC.limitTextField(_:)), name: "UITextFieldTextDidChangeNotification", object: txtContactNumber)
}
 func limitTextField(Notif:NSNotification) {

    let limit=10;

    let attributedString = NSMutableAttributedString(string: txtContactNumber.text!)
    attributedString.addAttribute(NSKernAttributeName, value: 7, range: NSMakeRange(0, (txtContactNumber.text?.characters.count)!))
   // attributedString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, count(textField.text)))
    attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blackColor(), range: NSMakeRange(0,(txtContactNumber.text?.characters.count)!))

    txtContactNumber.attributedText = attributedString
    if(txtContactNumber.text?.characters.count>limit)
    {
        txtContactNumber.text=txtContactNumber.text?.substringToIndex(limit)
    }
}
0
Arvind Kumar