如何垂直居中UITextField文本?

时间:2011-03-25 23:18:56

标签: ios uitextfield alignment

我只是简单地实例化一个UITextField并注意到文本不是垂直居中的。相反,它与我的按钮顶部齐平,我觉得有点奇怪,因为我希望默认值垂直居中。如何将其垂直居中,或者是否存在我缺少的默认设置?

5 个答案:

答案 0 :(得分:366)

textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

快速使用:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

答案 1 :(得分:7)

这可能有几个复杂的因素,有些人在前面的答案中提到过:

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

您尝试对齐的内容非常重要,因为字体应该由于线条高度,上升,下降等而垂直居中。 vertical font characteristics http://cdn.ilovetypography.com/img/vert-metrics/gxNh-minion.png
(图片感谢http://ilovetypography.com/2009/01/14/inconspicuous-vertical-metrics/

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

混合字母不太对劲:

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

答案 2 :(得分:4)

在故事板中:在控制之下 - >根据您的需要改变垂直和水平对齐。

enter image description here

答案 3 :(得分: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及早期版本。

答案 4 :(得分:0)

    //positive: up, negative:down
    NSAttributedStringKey.baselineOffset:0

    let attDic = [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 16),
                   NSAttributedStringKey.baselineOffset:0
         ] as [NSAttributedString.Key : Any];

    textfield.placeholder = =  NSAttributedString(string: "....", attributes: 
    attDic);