如何垂直居中UITextField文本?

我只是实例化一个UITextField并注意到文本不是垂直居中。 相反,它与我的button的顶部齐平,我觉得有点奇怪,因为我希望默认垂直居中。 我怎样才能垂直居中,还是有一些我缺less的默认设置?

 textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 

快速使用:

 textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center 

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

  • 你想要alignment(只是数字,只是字母,大写字母或混合)
  • 占位符
  • 清除button

你想要alignment的是重要的,因为字体中的哪一点应该由于行高,上行,下行等而垂直居中。
垂直字体特征http://cdn.ilovetypography.com/img/vert-metrics/gxNh-minion.png
(图片感谢http://ilovetypography.com/2009/01/14/inconspicuous-vertical-metrics/

例如,当你处理数字时,标准的中心alignment看起来不太正确。 比较下面的两个区别,它们使用相同的alignment方式(在下面的代码中),其中一个看起来是正确的,另一个看起来稍微偏离:

不太合适,混合的字母:

字母不看中心

但看起来是正确的,如果它只是数字

数字看中心

所以,不幸的是,它可能需要一些试验和错误和手动调整,以使其看起来正确。

我将下面的代码放在UITextField的子类中。 它调用超类方法,因为这考虑到了清除button的存在。

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

在故事板:在控制下 – >改变垂直以及水平alignment,根据您的需要。

在这里输入图像说明

这适用于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和更早版本。