web-dev-qa-db-ja.com

UITextFieldテキストを垂直方向に中央揃えするにはどうすればよいですか?

私は単にUITextFieldをインスタンス化し、テキストが垂直方向に中央揃えにならないことに気付いています。代わりに、ボタンの上部と同じ高さになりますが、デフォルトでは垂直方向に中央に配置されると予想されるため、奇妙に感じます。垂直方向に中央揃えするにはどうすればよいですか、欠落しているデフォルト設定がありますか?

143
Joey
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

Swiftで使用:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
367
Roger

これには、いくつかの複雑な要因が潜在的にあり、以前の回答で示唆されたものもあります。

  • 整列しようとしているもの(数字、文字、大文字、またはミックス)
  • プレースホルダー
  • クリアボタン

整列しようとしているのは重要です.
垂直フォント特性http://cdn.ilovetypography.com/img/vert-metrics/gxNh-minion.png
http://ilovetypography.com/2009/01/14/inconspicuous-vertical-metrics/ に感謝)

たとえば、数字だけを扱う場合、標準の中央揃えはあまり適切に見えません。同じアライメントを使用する以下の2つの違いを比較します(以下のコードで)。1つは正しく見え、もう1つはわずかに見えます。

文字が混在しているとあまり適切ではありません:

letters not looking centered

が、数字だけの場合は正しいように見えます

numbers looking centered

そのため、残念ながら、視覚的に正確に見えるようにするには、少し試行錯誤と手動調整が必要になる場合があります。

UITextFieldのサブクラスに以下のコードを配置しました。クリアボタンが存在することを考慮して、スーパークラスメソッドを呼び出します。

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

ストーリーボード内:制御下->必要に応じて、垂直方向と水平方向の配置を変更します。

enter image description here

4
Kumar KL

これは、textFieldのテキストに対して正常に機能します。ただし、プレースホルダーテキスト(テキストフィールドが空白のときに表示されるテキスト)を使用する場合は、iOS 7で問題が発生します。

TextFieldクラスをオーバーライドして解決し、

- (void) drawPlaceholderInRect:(CGRect)rect

方法。

このような:

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

IOS7と以前のバージョンの両方で動作します。

1
ancajic