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


143

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

回答:


369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

迅速な使用:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

1
@ user353877:これはまだ正常に動作します。ロジャーの応答でtextFieldは、が彼のUITextFieldインスタンスの名前であることに注意してください-あなたのインスタンスは異なる場合があります。だから彼はのようなものになりますUITextField *textField = [[UITextField alloc] init];。別の変数名(のtextField後以外のもの*)を使用する場合は、yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter代わりに使用する必要があります。
GeneralMike 2013

@ user353877 "Center"の直前にドットを追加:UIControlContentVerticalAlignment.Center;
Josh

1
UITextViewに同じメソッドはありますか?
カフェイン

このプロパティに対応する迅速なものはありますか?
demonofthemist

2
Swift 3.0では、これは列挙型を使用する場合に推奨される方法ですtextField.contentVerticalAlignment = .center
Glenn

9

これには潜在的にいくつかの複雑な要因があり、一部は以前の回答で言及されていました:

  • 位置合わせしようとしているもの(数字のみ、文字のみ、大文字のみ、または組み合わせ)
  • プレースホルダー
  • クリアボタン

どのようなフォントのどの点の垂直による行の高さ、アセンダ、ディセンダなどにセンタリングされなければならないので、あなたが整列しようとしていることが重要である:(ソースilovetypography.comに(画像おかげでhttp://ilovetypography.com/2009 / 01/14 /目立たない垂直メトリック/
縦書きフォントの特性


たとえば、数値のみを扱う場合、標準の中央揃えは適切に表示されません。以下の2つの違いを比較してください。これらは(下のコードで)同じ配置を使用しており、一方は正しく見え、もう一方は少しずれているように見えます。

文字が混在していると、正しくありません。

文字が中央揃えになっていない

でもそれが数字だけなら

中央揃えの数字

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

以下のコードを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)
}

placeholderRectForBounds右に伸びすぎていると思います。私には正しい見解があり、それは他の境界とは異なります。私textRectForBoundsは他の2つの関数から実装して呼び出しました:)
Sasho

5

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

ここに画像の説明を入力してください


1

これは、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と以前のバージョンの両方で動作します。


Swiftでそれをどのように処理しますか?self.placeholder.drawInRectはSwiftには存在しないためです。
King-Wizard

これは機能しますが、self.font.pointSizeはpointSizeよりもわずかに優れているようです
ED-209
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.