Вопрос по objective-c, vertical-alignment, ios, uilabel, text – Вертикальный текст по центру в UILabel в зависимости от фактической видимой высоты букв

2

Как я могу вертикально центрировать одну букву в UILabel, учитываяфактический видимый размер буквы, а не размер шрифта. Например, мне нужны буквы "F" и "о" быть точно в середине этикетки.

Я попытался отобразить метку на изображение, обрезать прозрачные пиксели и затем установить центр UIImageView, НО он всегда выглядит немного более размытым, чем фактическая метка.

Как этого достичь? Заранее спасибо.

Ваш Ответ

1   ответ
3

что вам нужно углубиться в основной текст, чтобы получить тот тип метрик глифа, который необходим для этого.

Тогда вместо того, чтобы пытаться переместить текст внутри UILabel, вы можете настроить метку 'Положение так, чтобы текст заканчивался там, где вы хотите.

В следующем примере кода, если _myLabel содержит символ, который в настоящее время имеет базовую линию, где вы хотите, чтобы текст центрировался, тоadjustLabel будет центрировать видимый глиф в этой строке.

В более реалистичном коде вы можете рассчитать все границы метки на основе границ глифов.

#import <coretext coretext.h="">
</coretext>

(И добавьте фреймворк в ваш проект. Тогда ...)

- (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);
}

Похожие вопросы