如何垂直居中放置UITextField文本?


143

我只是实例化一个,UITextField并注意到文本没有垂直居中。相反,它与按钮的顶部齐平,我觉得有些奇怪,因为我希望默认设置将其垂直居中。如何将其垂直居中,还是缺少一些默认设置?

Answers:


369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

快速使用:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

1
@ user353877:这仍然可以正常工作。请注意,在Roger的回应中,textField是他UITextField实例的名称-您的实例可能有所不同。所以他会有类似的东西UITextField *textField = [[UITextField alloc] init];。如果使用不同的变量名(比其他任何东西textField*),你需要做的yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter,而不是。
GeneralMike 2013年

@ user353877在“中心”之前添加一个点:UIControlContentVerticalAlignment.Center;
2015年

1
UITextView有相同的方法吗?
CaffeineShots's

此属性是否具有快速等效项?
demonofthemist

2
在Swift 3.0中,这是使用枚举的推荐方法:textField.contentVerticalAlignment = .center
Glenn

9

这可能有一些复杂的因素,在先前的答案中提到过一些:

  • 您要对齐的内容(仅数字,仅字母,仅大写字母或混合字母)
  • 占位符
  • 清除按钮

什么你要对齐是重要的,因为这点在字体应垂直居中,由于行高,伸,伸等。(来源:ilovetypography.com(图片感谢http://ilovetypography.com/2009 / 01/14 / inconspicuous-vertical-metrics /
垂直字体特征


例如,当您仅处理数字时,标准中心对齐方式看起来不太正确。比较下面两个中的差异,它们使用相同的对齐方式(在下面的代码中),其中一个看起来正确,而另一个看起来略微偏离:

混合字母不太正确:

字母看起来不居中

但如果只是数字就看起来正确

数字看起来居中

因此,不幸的是,它可能需要一些反复试验和手动调整才能使其外观正确。

我将下面的代码放在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 2015年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.