扩展UILabel以移除上升器?

时间:2016-06-25 04:04:48

标签: swift uilabel

在Interface Builder中,我希望能够通过Cap Height对齐UILabel。在IB中没有办法做到这一点,所以我想我可以扩展UILabel,以便框架从Cap Height所做的开始(通过上升帽高度减小框架的高度,然后通过该差异渲染文本)。我不太确定如何让文本在新的起源处绘制。我怎样才能将UILabel子类化,以便框架拥抱Cap Height?

1 个答案:

答案 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点高度的蓝色视图,其底部与其中一个自定义标签的顶部对齐,因此它绘制了自动布局认为是标签顶部的内容。结果如下:

layout result

如您所见,自定义标签在其顶盖高度处对齐,而普通标签的真正顶部也与两个自定义标签的顶盖高度对齐。

请注意,使用此解决方案,不再能够将任何内容与其中一个自定义标签的真实顶部对齐。

另请注意,我没有使用任何特殊的文字效果(例如凸版印刷,阴影或下划线)对此进行测试。那些可能会摒弃我的插图计算。

如果您需要不同的方法(因为您还需要与标签的真正顶部对齐),那么覆盖viewForLastBaselineLayout可能会更好。这应该让你改变自动布局认为标签基线的位置。将基线移动到上限,然后约束到基线。然后你可以约束帽高度和真正的顶部,但当然你不能限制到真正的基线。我还没有尝试过这个解决方案。