我只是实例化一个 UITextField,并注意到文本没有垂直居中。相反,它与我的按钮顶部齐平,我觉得有点奇怪,因为我希望默认的垂直居中。如何使其垂直居中,还是缺少某种默认设置?
UITextField
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
快速使用:
textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
这对 textField 的文本很有用。但是,如果您想使用占位符文本(文本将出现而 textfield 是空白的) ,在 iOS7上您将遇到问题。
我通过重写 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和早期版本。
在故事板中: 在控制之下-> 根据你的需要改变纵向和横向的对齐方式。
这可能带来了几个复杂的因素,其中一些在以前的答案中提到过:
你试图对齐的内容很重要,因为字体中的哪个点应该垂直居中,这是由于行高、上行线、下行线等原因。 (资料来源: Ilovetypography.com) (图片感谢 http://ilovetypography.com/2009/01/14/inconspicuous-vertical-metrics/)
例如,当您只处理数字时,标准的中心对齐方式看起来就不太正确。比较下面两个对齐方式的不同(在下面的代码中) ,一个看起来正确,另一个看起来有点不对:
混合使用字母不太合适:
但如果只是数字看起来还不错
所以,不幸的是,它可能需要一点试错和手动调整,使它看起来视觉正确。
我将下面的代码放在 UITextField 的一个子类中。它调用超类方法,因为它考虑到了正在出现的 clear 按钮。
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) }
您还可以通过调整文本基线来解决这个问题。
// positive: up, negative:down // NSAttributedStringKey.baselineOffset:0
let attDic: [NSAttributedString.Key: Any] = [ .font: UIFont.systemFont(ofSize: 16), .baselineOffset: 0 ]; textfield.placeholder = NSAttributedString(string: "....", attributes: attDic);