根据实际可见字母高度在 UILabel 中垂直居中文本

Posted

技术标签:

【中文标题】根据实际可见字母高度在 UILabel 中垂直居中文本【英文标题】:Vertically center text in UILabel depending on actual visible letter height 【发布时间】:2013-06-24 02:25:22 【问题描述】:

考虑到字母的实际可见大小,而不是字体大小,如何将 UILabel 中的单个字母垂直居中。例如,我需要字母“f”和“o”正好位于标签的中间。

我尝试将标签渲染为图像,裁剪透明像素,然后设置 UIImageView 的中心,但它总是看起来比实际标签稍微模糊。

如何做到这一点?提前致谢。

【问题讨论】:

【参考方案1】:

我认为您需要深入研究核心文本以获得执行此操作所需的字形指标。

然后,与其尝试在 UILabel 中移动文本,不如调整标签的位置,使文本最终到达您想要的位置。

在以下示例代码中,如果 _myLabel 包含的字符当前具有您希望文本居中的基线,则 adjustLabel 将在该行上居中可见字形。

在更实际的代码中,您可能会根据字形边界计算标签的整个边界。

#import <CoreText/CoreText.h>

(并将框架添加到您的项目中。然后...)

- (void)adjustLabel

    UIFont *uiFont = _myLabel.font;

    CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)(uiFont.fontName), uiFont.pointSize, NULL);

    UniChar ch = [_myLabel.text characterAtIndex:0];
    CGGlyph glyph;

    if (CTFontGetGlyphsForCharacters (ctFont, &ch, &glyph, 1)) 

        CGRect bounds = CTFontGetBoundingRectsForGlyphs (ctFont, kCTFontOrientationDefault, &glyph, nil, 1);
        CGFloat offset = bounds.origin.y + bounds.size.height/2.0;
        CGRect labelBounds = _myLabel.bounds;
        labelBounds.origin.y += offset;
        _myLabel.bounds = labelBounds;
    
    CFRelease(ctFont);

【讨论】:

以上是关于根据实际可见字母高度在 UILabel 中垂直居中文本的主要内容,如果未能解决你的问题,请参考以下文章

在 UIImageView 上设置顶部约束会导致 UILabel 固定高度

CSS垂直居中

Autolayout - 当一个视图具有动态高度时,在 UITableViewCell 中垂直居中两个视图

自动布局 4 个 UILabel,根据其内容/文本垂直高度

在父 UIView 中垂直居中 UILabel

根据内容自动增加视图的高度