UITextField Metnini dikey olarak nasıl ortalayabilirim?


143

Basitçe bir örnek oluşturuyorum UITextFieldve metnin dikey olarak ortalanmadığını fark ediyorum . Bunun yerine, varsayılanın dikey olarak ortalamasını beklediğimden, tuhaf bulduğum düğmenin üst kısmı ile aynı hizada. Dikey olarak nasıl ortalayabilirim veya eksik olduğum bazı varsayılan ayarlar var mı?

Yanıtlar:


369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

Hızlı kullanımda:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

1
@ user353877: Bu hala iyi çalışıyor. Roger'ın cevabında örneğinin textFieldadı olduğunu unutmayın UITextField- sizinki farklı olabilir. Yani onun gibi bir şey olacak UITextField *textField = [[UITextField alloc] init];. Farklı bir değişken adı ( textFieldsonrasındakinden farklı bir şey *) kullanırsanız, yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenterbunun yerine yapmanız gerekir .
GeneralMike

@ user353877 "Orta" dan hemen önce bir nokta ekleyin: UIControlContentVerticalAlignment.Center;
Josh

1
UITextView için aynı yöntem var mı?
CaffeineShots

Bu mülk için hızlı bir eşdeğer var mı?
demonofthemist

2
Swift 3.0'da, bir numaralandırma kullanmanın önerilen yolu budur:textField.contentVerticalAlignment = .center
Glenn

9

Bunun potansiyel olarak birkaç karmaşık faktörü vardır, bazıları önceki cevaplarda belirtilmiştir:

  • Hizalamaya çalıştığınız şey (yalnızca sayılar, sadece harfler, sadece büyük harfler veya bir karışım)
  • Yer tutucular
  • Temizle düğmesi

Ne yazı ki nokta arasında dikey nedeniyle satır yüksekliği ascenders, desandörlerin vb merkezli olmalıdır çünkü fazla uyum sağlamaya çalışıyoruz önemlidir : (kaynak ilovetypography.com ) için (Görüntü sayesinde http://ilovetypography.com/2009 / 01/14 / göze çarpmayan-dikey-metrikler / )
dikey yazı tipi özellikleri


Örneğin yalnızca sayılarla uğraşırken, standart merkez hizalama pek doğru görünmeyecektir. Aşağıdaki ikisi aynı hizalamayı kullanan (aşağıdaki kodda), biri doğru görünen diğeri hafifçe kapalı olan farkı karşılaştırın:

Harflerin bir karışımı ile doğru değil:

ortalanmış olmayan harfler

ama sadece rakamlarsa doğru görünüyor

ortalanmış sayılar

Bu nedenle, maalesef, görsel olarak doğru görünmesini sağlamak için biraz deneme yanılma ve manuel ayar yapılması gerekebilir.

Aşağıdaki kodu bir UITextField alt sınıfına yerleştirdim. Bu, mevcut temizle düğmesini dikkate aldığından üst sınıf yöntemlerini çağırır.

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

Bence placeholderRectForBoundssağa doğru çok fazla uzanıyor. Bir sağ görüşüm var ve diğer sınırların aksine buna giriyor. Yeni uyguladım textRectForBoundsve diğer 2 işlevden aradım :)
Sasho

5

Film şeridinde: Kontrol altında -> dikey ve yatay hizalamayı ihtiyaçlarınıza göre değiştirin.

resim açıklamasını buraya girin


1

Bu, textField'ın metni için iyi çalışır. Ancak yer tutucu metin (metin alanı boşken görünecek bir metin) kullanmak istiyorsanız, iOS 7'de sorunlarla karşılaşırsınız.

TextField sınıfını geçersiz kılarak çözdüm ve

- (void) drawPlaceholderInRect:(CGRect)rect

yöntem.

Bunun gibi:

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

Hem iOS7 hem de önceki sürümleri için çalışır.


Swift'te bunu nasıl hallediyorsun? Çünkü Swift'te self.placeholder.drawInRect mevcut değil.
King-Wizard

Bu işe yarar, ama self.font.pointSize pointSize'den biraz daha iyi çalışıyor gibi görünüyor
ED-209
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.