回答:
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
迅速な使用:
textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
textField.contentVerticalAlignment = .center
これには潜在的にいくつかの複雑な要因があり、一部は以前の回答で言及されていました:
どのようなフォントのどの点の垂直による行の高さ、アセンダ、ディセンダなどにセンタリングされなければならないので、あなたが整列しようとしていることが重要である:(ソース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つの関数から実装して呼び出しました:)
これは、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と以前のバージョンの両方で動作します。
textField
は、が彼のUITextField
インスタンスの名前であることに注意してください-あなたのインスタンスは異なる場合があります。だから彼はのようなものになりますUITextField *textField = [[UITextField alloc] init];
。別の変数名(のtextField
後以外のもの*
)を使用する場合は、yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter
代わりに使用する必要があります。