垂直居中UILabel时忽略Ascender和Descender?

Luk*_*uke 6 fonts objective-c ios autolayout

我正在使用AutoLayout将一些标签放在单元格的垂直中心.文本是全部大写的,但UILabel问题是,即使sizeToFit应用,也会在文本下方留下空间,这看起来很像字母上的尾部,例如小写的y,p和q.因为我是垂直居中的,所以这会导致偏移并且意味着文本看起来比应该做的高几个像素.

另一个问题可能是:我可以根据字体是否包含使用上升器或下降器的任何字符来智能地调整其垂直中心吗?

例如,字符串"abbaba"不需要下降器,而字符串"oyyoyo"不需要上升器.全部大写字符串也不需要下降器.如果我垂直居中"oyyoyoyo"它会显得太低.

在此输入图像描述

Fer*_*nch 4

谢谢,阿比尼特回答。

我也在寻找这个,所以我想在这里发布您需要应用的确切约束来根据您的喜好对齐文本。

维基百科的这张图片显示了字体的不同大小部分。

在此输入图像描述

因此,对齐标签的方法有很多种,具体取决于您是否想要对齐上升高度、大写高度、x 高度、基线或下降高度。

假设您有一个label包含大写字母的文本,例如“HELLO”,并且您想要与viewAbove大写高度对齐并与viewBelow基线对齐。

你会这样做:

let font = label.font
let ascenderDelta = font.ascender - font.capHeight

LayoutHelper()
    .addViews([
        "label":label, "viewAbove":viewAbove, "viewBelow":viewBelow
    ])
    .withMetrics(["ascenderDelta":ascenderDelta])
    .addConstraints([

        // -- Here the constraints to align to cap height --
        "X:label.top == viewAbove.bottom - ascenderDelta",
        "X:label.baseline == viewBelow.top",

        ...other constraints...
    ])
Run Code Online (Sandbox Code Playgroud)

注意:在示例中我使用我的实用程序类LayoutHelper,但我希望这个想法很清楚。

关于“自动对齐”标签:

我会考虑制作一个“智能”标签,根据它是否包含下降部分、上升部分、大写字母等来调整到适当的行。

您可以使用负插入来做到这一点drawTextInRect(就像这里,但是,例如,使用insets = {-ascenderDelta, 0, font.descender, 0})。但这会裁剪任何上升/下降部分,以防万一。我更喜欢与大写字母对齐而不裁剪任何可能的上升部分。