web-dev-qa-db-fra.com

Texte d'espace réservé non centré pour UITextField créé par programme

Je crée un UITextField par programme et le place dans un UIView. La taille de la police est définie sur 15.0f (police système). Mais l'espace réservé qui apparaît n'est pas centré dans la vue du texte. Quelqu'un sait comment résoudre ceci? 

J'ai trouvé des références sur SO pour le texte flou, etc. et j'ai essayé de définir le cadre du champ de texte avec des valeurs entières, mais cela ne fait aucune différence.

UITextField *txtField = [[UITextField alloc] initWithFrame:CGRectMake(5.0f, 6.0f, 278.0f, 32.0f)];
[txtField setPlaceholder:@"My placeholder"];
[txtField setFont:[UIFont systemFontOfSize:15.0]];
[txtField setBorderStyle:UITextBorderStyleRoundedRect];
[txtField setAutocorrectionType:UITextAutocorrectionTypeNo];
[txtField setAutocapitalizationType:UITextAutocapitalizationTypeNone];
[txtField setKeyboardType:UIKeyboardTypeEmailAddress];
[txtField setReturnKeyType:UIReturnKeyDone];
[txtField setClearButtonMode:UITextFieldViewModeWhileEditing];

Merci pour toute aide

Note: Je veux dire que le texte n'est pas centré verticalement dans le champ de texte (il est un peu vers le haut). Donc, définir l'alignement du texte n'est pas la solution.

Ajout d’une image du problème à des fins de clarification - comme le montre l’image, le texte d’espace réservé est placé vers le haut et non au centre verticalement .alt text

44
lostInTransit

Vous devez ajouter:

txtField.textAlignment = NSTextAlignmentCenter; // Pre-iOS6 SDK: UITextAlignmentCenter

N'oubliez pas que ceci ajuste à la fois l'alignement du texte de substitution et celui que l'utilisateur entrera.

Comment centrer verticalement

Puisque la question initiale a été mise à jour pour demander comment aligner verticalement le texte de substitution et que cette réponse est enterrée dans les commentaires, voici comment procéder:

txtField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
56
jer

Cela ne fonctionne pas comme prévu sur iOS7. Sur iOS7, vous devrez remplacer la classe TextField et 

- (void) drawPlaceholderInRect:(CGRect)rect

méthode.

Comme ça:

- (void) drawPlaceholderInRect:(CGRect)rect
{
    [[UIColor blueColor] setFill];
    CGRect placeholderRect = CGRectMake(rect.Origin.x, (rect.size.height- self.font.pointSize)/2, rect.size.width, self.font.pointSize);
    [[self placeholder] drawInRect:placeholderRect withFont:self.font lineBreakMode:NSLineBreakByWordWrapping alignment:self.textAlignment];
}

Fonctionne pour iOS7 et les versions antérieures.

18
ancajic

J'utilisais juste la couleur, mais nous devons également définir la police.

Celui-ci a fonctionné pour moi:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setDefaultTextAttributes:
@{
     NSForegroundColorAttributeName:[UIColor whiteColor], 
     NSFontAttributeName: [UIFont systemFontOfSize:12]
}];
2
diegosantiviago

Changer la hauteur de ligne minimale en utilisant NSParagraphStyle était la seule solution qui fonctionnait pour moi:

    NSMutableParagraphStyle *style = [self.addressBar.defaultTextAttributes[NSParagraphStyleAttributeName] mutableCopy];
style.minimumLineHeight = self.addressBar.font.lineHeight - (self.addressBar.font.lineHeight - placeholderFont.lineHeight) / 2.0;

self.addressBar.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Placeholder text" attributes:@{
     NSForegroundColorAttributeName: [UIColor colorWithRed:79/255.0f green:79/255.0f blue:79/255.0f alpha:0.5f],
     NSFontAttributeName : placeholderFont,
     NSParagraphStyleAttributeName : style
}];
0
mattsson