在UILabel中垂直居中文本取决于实际可见的字母高度

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

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

这怎么能实现? 提前致谢。

我认为你需要深入研究核心文本来获得所需的字形度量。

然后,不要尝试移动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); }