在Interface Builder中,我希望能够通过Cap Height对齐UILabel。在IB中没有办法做到这一点,所以我想我可以扩展UILabel,以便框架从Cap Height所做的开始(通过上升帽高度减小框架的高度,然后通过该差异渲染文本)。我不太确定如何让文本在新的起源处绘制。我怎样才能将UILabel子类化,以便框架拥抱Cap Height?
答案 0 :(得分:3)
执行此操作的一种方法是继承UILabel
并覆盖alignmentRectInsets
:
@IBDesignable
class CapHeightAligningLabel: UILabel {
override var alignmentRectInsets: UIEdgeInsets {
return UIEdgeInsets(top: font.ascender - font.capHeight, left: 0, bottom: 0, right: 0)
}
}
我制作了三个标签:一个UILabel
和两个CapHeightAligningLabel
。我对齐了所有三个的顶部。我还制作了一个1点高度的蓝色视图,其底部与其中一个自定义标签的顶部对齐,因此它绘制了自动布局认为是标签顶部的内容。结果如下:
如您所见,自定义标签在其顶盖高度处对齐,而普通标签的真正顶部也与两个自定义标签的顶盖高度对齐。
请注意,使用此解决方案,不再能够将任何内容与其中一个自定义标签的真实顶部对齐。
另请注意,我没有使用任何特殊的文字效果(例如凸版印刷,阴影或下划线)对此进行测试。那些可能会摒弃我的插图计算。
如果您需要不同的方法(因为您还需要与标签的真正顶部对齐),那么覆盖viewForLastBaselineLayout
可能会更好。这应该让你改变自动布局认为标签基线的位置。将基线移动到上限,然后约束到基线。然后你可以约束帽高度和真正的顶部,但当然你不能限制到真正的基线。我还没有尝试过这个解决方案。