web-dev-qa-db-fra.com

Le texte dans UITextField monte après l'édition (au centre pendant l'édition)

J'ai un étrange problème. J'ai un UITextField dans lequel l'utilisateur doit écrire la quantité de quelque chose, de sorte que le champ s'appelle "amountField". Tout semble aller bien, lorsque l'utilisateur commence à éditer le champ de texte, le texte est au centre vertical et horizontal - c'est génial. 

Cependant, lorsque l'utilisateur termine l'édition, le texte monte un peu. J'ai essayé beaucoup de choses, rien n'a aidé ... 

J'ajoute des captures d'écran ci-dessous pour que vous puissiez voir quel est le problème.

Voici à quoi cela ressemble lors de la modification du champ - ce n'est pas grave.

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

Et voici à quoi ça ressemble quand le montage est terminé - c’est le problème!

This is the problem.

S'il vous plaît, si quelqu'un sait ce qui pourrait causer cela, je vous en serais très reconnaissant! :)

Voici une partie de mon code lié à amountField.

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: Ces coins blancs sont là parce que je règle le fond en blanc avec 0,2 alpha, ça va.

45
Dominik Hadl

Alors...

Après de nombreuses heures d’essai, j’ai trouvé le problème ..___ Dans mon cas, le problème est la police de caractères. Je ne sais vraiment pas pourquoi, mais l'auteur de la police a rendu la police étrange (en tête, etc.), il y a un espace vide en bas. Je ne sais pas pourquoi, mais lorsque vous modifiez le texte, toutes les propriétés du texte sont ignorées, mais une fois la modification terminée, elles sont appliquées.

Donc, si vous avez un problème similaire, essayez de changer la police en Arial ou quelque chose de similaire.

Pour une explication complète, veuillez consulter les liens suivants: lien 1 et lien 2 . La solution recommandée dans ces liens peut vous éviter beaucoup de maux de tête et peut même être appliquée pour résoudre des problèmes tels que le déplacement du texte vers le haut lorsque vous commencez à modifier un UITextField (à l'aide de la police System ou d'autres polices particulières).

23
Dominik Hadl

J'ai eu un problème similaire qui a commencé à se produire sur iOS 9 . En gros, j'ai un UITextField dans une cellule de vue de collection. Parfois, lorsque l'utilisateur a fini de taper et que l'édition est terminée, le texte "rebondit" puis remonte dans sa position correcte. Pépin très étrange et ennuyeux. Faire simplement ce tweak corrige le problème sur iOS 9 et s’avère sûr sur iOS 7 et 8:

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

La désactivation de ClipsToBounds pour TextField a résolu le problème pour moi.

8
Alexis Candelaria

Ce bogue m'est arrivé lorsque j'ai défini le texte et que je suis devenu le premier répondant dans viewDidLoad ou viewWillAppear Lorsque j'ai déplacé le code becomeFirstResponder vers viewDidAppear, le bogue est parti.

3
skr1p7k1dd

Je suis aux prises avec ce problème presque chaque fois que l'application est conçue avec une police personnalisée. Une option consiste à réparer la police (mais cela représente trop de travail, du moins pour moi :)). La deuxième option que j'utilise est de sous-classer UITextField et de remplacer les méthodes éditionRectForBounds: et placeholderRectForBounds: et corriger le décalage. Cela devrait fonctionner pour votre cas aussi.

@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

Je ne l'ai pas encore testé avec leftView ou rightView, soyez donc prudent lorsque vous les utilisez :)

REMARQUE: cette approche dépend de la police. Les valeurs utilisées pour le décalage peuvent varier pour chaque police et taille. 

2
JakubKnejzlik

J'ai résolu ce problème en ajoutant des contraintes de hauteur à mes UITextFields.

1

Il y a un petit problème sur iOS 8.1 et les versions ultérieures. Je ne sais pas s'ils le corrigeront plus tard, mais à ce moment-là, aucune solution unique ne résout tous les problèmes, car le bogue et les solutions utilisés sont du type de police et de la taille.

L'une de ces solutions ou une combinaison de ces solutions ci-dessous peut résoudre votre problème:

  • Changer la taille de la police.

  • Changer le type de police.

  • Changer la taille de UITextField. 

  • Décompiler la police en question, modifier les caractéristiques de la police et la recompiler (pour plus d'explications, veuillez consulter les liens suivants: lien 1 et lien 2 ).

Sinon, cette autre solution autonome ci-dessous peut résoudre votre problème:

Version rapide

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))
    }

}

Cette solution a été testée avec leftView et fonctionne à merveille. 

NOTE: cette approche dépend de la police. Les valeurs utilisées pour CGRectInset peuvent varier pour chaque police et taille.

0
King-Wizard

Ces solutions ci-dessus ne fonctionnent pas pour moi. Ma solution est la sous-classe UITextField et substitue setText:

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

J'ai eu des problèmes similaires avec un UITextfield intégré dans un UITableViewCell. Où ce code est-il situé dans votre projet? Je pense que ce qui se passe, c'est qu'après que vous ayez fini de modifier un champ de texte particulier, celui-ci s'envoie lui-même -setNeedsDisplay et son drawRect: est ensuite appelé. Cela pourrait expliquer le changement d'alignement. Dans mon scénario particulier, je devais utiliser une méthode déléguée de vue tableau -willDisplayCell... pour définir l'alignement du contenu. Je devrais en savoir plus sur votre conception pour éventuellement proposer une suggestion.

Une solution potentielle consiste à utiliser les méthodes de délégation de champ de texte pour définir l'alignement du contenu.

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

Vérifiez le clavier pour modifier l'affichage de la position de la fenêtre contextuelle s'il y a une ligne de code self.view.layoutIfNeeded() Supprimez-la. Bonne chance!

0
Gilbertat

En effet, le BaselineOffset du champ de texte a été modifié. Dans UITextFieldDidEndEditing, créer un texte attribué avec NSBaselineOffset: 0 et l’utiliser attributedText résoudrait le problème.

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

Je ne pouvais pas changer le fichier de police, donc quand j'ai résolu ce problème, j'ai sauvegardé le cadre original de UITextField dans une propriété et appliqué le code suivant:

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

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

C'est un peu hacky, mais ça fait le travail.

0
Zak Arntson