考虑到字母的实际可见尺寸,而不是字体大小,我如何在UILabel中垂直居中单个字母。例如,我需要字母'f'和'o'正好位于标签的中间。
我试图将标签渲染到图像,裁剪透明像素然后设置UIImageView的中心但是它总是比实际标签看起来更模糊。
如何实现这一目标?提前谢谢。
答案 0 :(得分:3)
我认为您需要深入研究核心文本,以获得执行此操作所需的字形指标。
然后,您可以调整标签的位置,以便文本最终位于您想要的位置,而不是尝试在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);
}