it-swarm.com.de

Text in UITextField wird nach der Bearbeitung nach oben verschoben (in der Mitte während der Bearbeitung)

Ich habe ein seltsames Problem. Ich habe ein UITextField, in das der Benutzer die Menge von etwas schreiben soll, daher heißt das Feld "QuantityField". Alles sieht gut aus, wenn der Benutzer das Textfeld bearbeitet, befindet sich der Text in der vertikalen und horizontalen Mitte - das ist großartig. 

Wenn der Benutzer die Bearbeitung beendet, wird der Text jedoch etwas nach oben verschoben. Ich habe viele Dinge ausprobiert, nichts half ... 

Ich füge unten Screenshots hinzu, damit Sie sehen können, was das Problem ist.

So sieht es beim Bearbeiten des Feldes aus - das ist in Ordnung.

This is while editing the field - that's ok.

Und so sieht es nach der Bearbeitung aus - das ist das problem!

This is the problem.

Wenn jemand wüsste, was dies bewirken könnte, wäre ich sehr dankbar! :)

Hier ist ein Teil meines Codes, der sich auf das QuantityField bezieht.

amountField.keyboardType = UIKeyboardTypeNumberPad;
amountField.returnKeyType = UIReturnKeyDone;
amountField.delegate = self;

[amountField setFont:[UIFont fontWithName:@"Nuptial Script LT Std" size:30]];   
amountField.borderStyle = UITextBorderStyleNone;
UIImage *amountBg = [UIImage imageNamed:@"skin2_ipad_amountField.png"];
[amountField setBackground:amountBg];

amountField.rightView = nil;
//amountField.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.2];

amountField.textAlignment = UITextAlignmentCenter;
amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
amountField.adjustsFontSizeToFitWidth = YES;
amountLabel.textColor = UIColorFromARGB(0x313030); //Using my own macro

amountField.frame = CGRectMake(300, 480, 136, 32);
amountField.center = CGPointMake(605, 439);

PS: Diese weißen Ecken sind da, weil ich den Hintergrund mit 0,2 Alpha auf Weiß eingestellt habe, das ist in Ordnung.

45
Dominik Hadl

So...

Nach vielen Stunden des Ausprobieren vieler Dinge - habe ich das Problem gefunden ... In meinem Fall ist das Problem die Schriftart. Ich weiß wirklich nicht warum, aber der Autor der Schrift hat die Schrift seltsam gemacht (Leading etc.), sie hat unten ein Leerzeichen. Ich weiß nicht warum, aber wenn Sie den Text bearbeiten, werden alle Texteigenschaften ignoriert, aber wenn Sie mit der Bearbeitung fertig sind, werden sie angewendet.

Wenn Sie also ein ähnliches Problem haben, ändern Sie die Schriftart in Arial oder etwas Ähnliches.

Eine vollständige Erklärung finden Sie unter den folgenden Links: Link 1 und Link 2 . Die in diesen Links empfohlene Lösung kann Ihnen viele Kopfschmerzen ersparen und kann sogar angewendet werden, um Probleme wie das Verschieben von Text nach oben zu beheben, wenn Sie mit der Bearbeitung eines UITextFields beginnen (mit Systemschriftart oder anderen speziellen Schriftarten).

23
Dominik Hadl

Ich hatte ein ähnliches Problem, das auf iOS 9 auftrat. Grundsätzlich habe ich ein UITextField in einer Collection-View-Zelle. Manchmal, wenn der Benutzer mit der Eingabe und Bearbeitung fertig ist, "springt" der Text in die richtige Position. Sehr seltsame und nervige Panne. Mit diesem Tweak wurde das Problem auf iOS 9 behoben und auf iOS 7 und 8 als sicher eingestuft:

 - (void)textFieldDidEndEditing:(UITextField *)textField
 {
    [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch
    //...other stuff
}
51
n8tr

Das Deaktivieren von ClipsToBounds für das TextField löste es für mich.

8

Dieser Fehler ist mir passiert, als ich Text gesetzt und der erste Responder in viewDidLoad oder viewWillAppear wurde. Als ich den becomeFirstResponder-Code in viewDidAppear verschoben habe, ist der Fehler verschwunden.

3
skr1p7k1dd

Ich habe mit diesem Problem fast immer zu kämpfen, wenn das Design der App mit einer benutzerdefinierten Schriftart erstellt wird. Eine Möglichkeit besteht darin, die Schriftart zu korrigieren (dies ist jedoch zu viel Arbeit - zumindest für mich :)). Die zweite Option, die ich verwende, ist das Sub-Classing des UITextField und das Überschreiben der EditingRectForBounds: - und PlaceholderRectForBounds: -Methoden und die Korrektur des Offsets. Es sollte auch für Ihren Fall funktionieren.

@implementation MyTextFieldWithFixedFontPosition

-(CGRect)editingRectForBounds:(CGRect)bounds{
    return CGRectOffset([self textRectForBounds:bounds], 0, 0.5); //0.5 is just example, you can adjust to any offset you like
}
-(CGRect)placeholderRectForBounds:(CGRect)bounds{
    return [self editingRectForBounds:bounds];
}

@end

Ich habe es jedoch nicht mit leftView oder rightView getestet, seien Sie also vorsichtig, wenn Sie diese verwenden :)

HINWEIS: Dieser Ansatz ist "font-abhängig". Die für den Offset verwendeten Werte können für jede Schriftart und Größe variieren 

2
JakubKnejzlik

Ich habe dies behoben, indem ich meinen UITextFields Höhenbeschränkungen hinzufügte.

1

Unter iOS 8.1 und darunter gibt es eine Störung. Ich weiß nicht, ob sie es später beheben werden. Zu diesem Zeitpunkt gibt es keine eindeutige Lösung, die alle Fälle behebt, da der Fehler und die Lösungen vom Typ der Schrift und von der Größe abhängig sind.

Eine dieser Lösungen oder eine Kombination dieser Lösungen kann Ihr Problem beheben:

  • Ändern der Schriftgröße.

  • Schrifttyp ändern.

  • Ändern der Größe des UITextFields. 

  • Die betreffende Schriftart wird dekompiliert, die Eigenschaften der Schriftart werden geändert und neu kompiliert (weitere Informationen finden Sie unter den folgenden Links: Link 1 und Link 2 ).

Andernfalls kann diese andere autarke Lösung Ihr Problem beheben:

Swift-Version

import UIKit

class CustomTextField: UITextField {

    ...

    override func textRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

    override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

}

Diese Lösung wurde mit leftView getestet und funktioniert wie ein Zauber. 

HINWEIS: Dieser Ansatz ist "font-abhängig". Die für CGRectInset verwendeten Werte können für jede Schriftart und Größe variieren.

0
King-Wizard

Diese Lösung funktioniert für mich nicht. Meine Lösung ist die Unterklasse UITextField und überschreibt setText:

- (void) setText:(NSString *)text {
    [super setText:text];
    [self layoutIfNeeded];
}
0
rollingstoneW

Ich hatte ähnliche Probleme mit einer UITextfield, die in eine UITableViewCell eingebettet war. Wo genau befindet sich dieser Code in Ihrem Projekt? Ich glaube, dass es passiert ist, dass, nachdem Sie ein bestimmtes Textfeld bearbeitet haben, es sich -setNeedsDisplay sendet und anschließend drawRect: aufgerufen wird. Dies könnte die Verschiebung der Ausrichtung erklären. In meinem speziellen Szenario musste ich eine Tabellensicht-Delegatenmethode -willDisplayCell... verwenden, um die Inhaltsausrichtung festzulegen. Ich müsste mehr über Ihr Design wissen, um möglicherweise einen Vorschlag zu unterbreiten.

Eine mögliche Lösung wäre die Verwendung der Textfeld-Delegiermethoden zum Festlegen der Inhaltsausrichtung.

-(void)textFieldDidEndEditing:(UITextField *)textField{
     if (amountField == textField){
          amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        }
}
0
Brian Palma

Überprüfen Sie die Tastatur, um die Ansicht der Position des Popup-Fensters zu ändern, wenn eine Codezeile self.view.layoutIfNeeded() vorhanden ist.

0
Gilbertat

Dies liegt daran, dass das BaselineOffset für das Textfeld geändert wurde. In UITextFieldDidEndEditing das Erstellen eines Attributetextes mit NSBaselineOffset: 0 und die Verwendung dieser attributedText würde das Problem beheben.

-(IBAction)txtFieldDidEndEditing:(UITextField *)sender {
     NSDictionary *style = @{
                            NSBaselineOffsetAttributeName: @(0)
                            };
    self.txtField.attributedText = [[NSAttributedString alloc] initWithString:self.txtField.text attributes:style];
}
0
kdvijay

Ich konnte die Schriftartdatei nicht ändern. Als ich das Problem gelöst hatte, speicherte ich den ursprünglichen Rahmen von UITextField in einer Eigenschaft und wendete den folgenden Code an:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    textField.frame = self.usernameFrame;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    textField.frame = CGRectOffset(self.usernameFrame, 0, 1);
}

Es ist ein bisschen hackig, aber es erledigt die Arbeit.

0
Zak Arntson