Come posso centrare verticalmente UITextField Text?


143

Sto semplicemente istanziando a UITextFielde noto che il testo non è centrato verticalmente. Invece, è a filo con la parte superiore del mio pulsante, che trovo strano in quanto mi aspetterei che il valore predefinito sia centrato verticalmente. Come posso centrarlo verticalmente o c'è qualche impostazione predefinita che mi manca?

Risposte:


369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

In un rapido utilizzo:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

1
@ user353877: funziona ancora bene. Nota che nella risposta di Roger, textFieldè il nome della sua UITextFieldistanza: la tua potrebbe essere diversa. Quindi avrà qualcosa del genere UITextField *textField = [[UITextField alloc] init];. Se usi un nome di variabile diverso (qualsiasi cosa diversa da textFielddopo il *), devi yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenterinvece farlo .
GeneralMike,

@ user353877 Aggiungi un punto subito prima di "Centro": UIControlContentVerticalAlignment.Center;
Josh,

1
c'è lo stesso metodo per UITextView?
Caffeina

Esiste un rapido equivalente per questa proprietà?
demonofthemist il

2
In Swift 3.0, questo è il modo raccomandato per usare un enum:textField.contentVerticalAlignment = .center
Glenn,

9

Ciò ha potenzialmente diversi fattori complicanti, alcuni citati nelle risposte precedenti:

  • Cosa stai cercando di allineare (solo numeri, solo lettere, solo lettere maiuscole o un mix)
  • segnaposto
  • Pulsante Cancella

Quello che stai cercando di allineare è importante a causa di quale punto del carattere dovrebbe essere centrato verticalmente a causa dell'altezza della linea, degli ascendenti, dei discendenti ecc. (Fonte: ilovetypography.com ) (Immagine grazie a http://ilovetypography.com/2009 / 01/14 / metriche verticali poco appariscenti / )
caratteristiche del carattere verticale


Quando hai a che fare solo con numeri, ad esempio, l'allineamento centrale standard non sembrerà del tutto corretto. Confronta la differenza tra i due seguenti, che utilizzano lo stesso allineamento (nel codice seguente), uno dei quali sembra corretto e l'altro che appare leggermente diverso:

Non del tutto giusto con un mix di lettere:

le lettere non sembrano centrate

ma sembra giusto se sono solo numeri

numeri che sembrano centrati

Quindi, sfortunatamente, potrebbe essere necessario un po 'di tentativi, errori e modifiche manuali per renderlo visivamente corretto.

Ho inserito il codice seguente in una sottoclasse di UITextField. Chiama i metodi di superclasse in quanto tiene conto del pulsante di cancellazione presente.

override func awakeFromNib() {
    contentVerticalAlignment = UIControlContentVerticalAlignment.Center
}

override func textRectForBounds(bounds: CGRect) -> CGRect {
    let boundsWithClear = super.textRectForBounds(bounds)
    let delta = CGFloat(1)
    return CGRect(x: boundsWithClear.minX, y: delta, width: boundsWithClear.width, height: boundsWithClear.height - delta/2)
}

override func editingRectForBounds(bounds: CGRect) -> CGRect {
    let boundsWithClear = super.editingRectForBounds(bounds)
    let delta = CGFloat(1)
    return CGRect(x: boundsWithClear.minX, y: delta, width: boundsWithClear.width, height: boundsWithClear.height - delta/2)
}

override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
    let delta = CGFloat(1)
    return CGRect(x: bounds.minX, y: delta, width: bounds.width, height: bounds.height - delta/2)
}

Penso che l' placeholderRectForBoundsestensione si estenda troppo a destra. Ho una visione giusta e ci va diversamente dagli altri limiti. Ho appena implementato textRectForBoundse lo ha chiamato dalle altre 2 funcs :)
Sasho

5

Nello storyboard: Sotto controllo -> modifica l'allineamento verticale e orizzontale, in base alle tue esigenze.

inserisci qui la descrizione dell'immagine


1

Funziona bene con il testo di textField. Ma se vuoi usare il testo segnaposto (un testo che apparirà mentre il campo di testo è vuoto), su iOS 7 incontrerai problemi.

L'ho risolto sovrascrivendo la classe TextField e

- (void) drawPlaceholderInRect:(CGRect)rect

metodo.

Come questo:

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

Funziona con iOS7 e versioni precedenti.


Come lo gestisci in Swift? Perché self.placeholder.drawInRect non esiste in Swift.
Re-Wizard il

funziona, ma self.font.pointSize sembra funzionare leggermente meglio di pointSize
ED-209
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.