gpt4 book ai didi

swift - 扩展 UILabel 以删除 ascender?

转载 作者:可可西里 更新时间:2023-11-01 00:59:13 30 4
gpt4 key购买 nike

在 Interface Builder 中,我希望能够通过 Cap Height 对齐 UILabel。在 IB 中没有办法做到这一点,所以我想我可能会扩展 UILabel,以便框架从 Cap Height 所在的位置开始(通过 ascender-cap 高度降低框架的高度,然后将文本渲染得更高)。不过,我不太确定如何让文本在新原点绘制。我怎样才能将 UILabel 子类化,以便框架紧贴上限高度?

最佳答案

一种方法是继承 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 磅高的蓝色 View ,其底部与其中一个自定义标签的顶部对齐,因此它绘制了自动布局认为是标签顶部的内容。结果如下:

layout result

如您所见,自定义标签在其大写高度对齐,普通标签的真实顶部也与两个自定义标签的大写高度对齐。

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

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

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

关于swift - 扩展 UILabel 以删除 ascender?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38024829/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com