Bagaimana cara memusatkan Teks UITextField secara vertikal?

143

Saya hanya instantiating UITextFielddan memperhatikan bahwa teks tidak terpusat secara vertikal. Sebaliknya, itu rata dengan bagian atas tombol saya, yang saya temukan agak aneh karena saya akan mengharapkan default untuk memusatkannya secara vertikal. Bagaimana saya bisa memusatkannya secara vertikal, atau ada pengaturan default yang saya lewatkan?

Joey
sumber

Jawaban:

369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

Dalam penggunaan cepat:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
Roger
sumber
1
@ user353877: Ini masih berfungsi dengan baik. Perhatikan bahwa dalam respons Roger, textFieldadalah nama dari UITextFieldinstansinya - milik Anda mungkin berbeda. Jadi dia akan memiliki sesuatu seperti UITextField *textField = [[UITextField alloc] init];. Jika Anda menggunakan nama variabel yang berbeda (selain dari textFieldsetelah *), Anda harus melakukannya yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter.
GeneralMike
@ user353877 Tambahkan titik tepat sebelum "Pusat": UIControlContentVerticalAlignment.Center;
Josh
1
apakah ada metode yang sama untuk UITextView?
CaffeineShots
Apakah ada padanan cepat untuk properti ini?
demonofthemist
2
Di Swift 3.0, ini adalah cara yang disarankan dalam menggunakan enum:textField.contentVerticalAlignment = .center
Glenn
9

Ini berpotensi mendapat beberapa faktor yang menyulitkan, beberapa disinggung dalam jawaban sebelumnya:

  • Apa yang Anda coba selaraskan (hanya angka, hanya huruf, hanya huruf besar atau campuran)
  • Placeholder
  • Tombol yang jelas

Apa yang Anda coba selaraskan adalah penting karena titik mana dalam font harus dipusatkan secara vertikal karena ketinggian garis, ascenders, descenders dll. (Sumber: ilovetypography.com ) (Gambar terima kasih kepada http://ilovetypography.com/2009 / 01/14 / metrik-vertikal-mencolok / )
karakteristik font vertikal


Misalnya, ketika Anda berurusan dengan angka saja, perataan tengah standar tidak akan terlihat benar. Bandingkan perbedaan pada dua di bawah ini, yang menggunakan perataan yang sama (dalam kode di bawah), yang salah satu terlihat benar dan yang lain terlihat sedikit salah:

Tidak tepat dengan campuran huruf:

surat tidak terlihat terpusat

tetapi terlihat benar jika itu hanya angka

angka tampak terpusat

Jadi, sayangnya, mungkin perlu sedikit coba-coba dan penyesuaian manual untuk membuatnya tampak benar secara visual.

Saya menempatkan kode di bawah ini dalam subclass dari UITextField. Itu memanggil metode superclass karena ini memperhitungkan tombol yang jelas hadir.

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)
}
dgn jelas
sumber
Saya pikir placeholderRectForBoundsterlalu meluas ke kanan. Saya memiliki pandangan kanan dan masuk ke dalamnya tidak seperti batas lainnya. Saya baru saja menerapkan textRectForBoundsdan memanggilnya dari 2 funcs lainnya :)
Sasho
5

Di storyboard: Di bawah kontrol -> ubah perataan vertikal maupun horizontal, sesuai dengan kebutuhan Anda.

masukkan deskripsi gambar di sini

Kumar KL
sumber
1

Ini berfungsi dengan baik untuk teks textField. Tetapi jika Anda ingin menggunakan teks placeholder (teks yang akan muncul saat bidang teks kosong), di iOS 7 Anda akan mengalami masalah.

Saya memecahkannya dengan menimpa kelas TextField dan

- (void) drawPlaceholderInRect:(CGRect)rect

metode.

Seperti ini:

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

Bekerja untuk iOS7 dan versi sebelumnya.

ancajic
sumber
Bagaimana Anda mengatasinya di Swift? Karena self.placeholder.drawInRect tidak ada di Swift.
King-Wizard
ini bekerja, tetapi self.font.pointSize tampaknya bekerja sedikit lebih baik daripada pointSize
ED-209