2014-03-25 130 views
4

我正在使用UILabel(iOS7)中的字體,並且遇到了一些我希望有人可以解釋的東西: 字體的Glyph,Ascender和Descender之間的關係是什麼?iOS中字體Glyph Ascender和Descender之間的關係是什麼?

從我讀過的文檔中,Ascender是基線上方字體的一部分,下面是下面的部分(返回爲負值)。組合的絕對值應該是字體的最大高度。

From Apple's documentation

例如255的伸部和-64下降部將給出319 的總高度然而銘文高度返回爲228.4

編輯:這裏的字形碼:

CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)(uiFont.fontName), uiFont.pointSize, NULL); 
UniChar ch = [msgLabel.text characterAtIndex:0]; 
CGGlyph glyph; 
if (CTFontGetGlyphsForCharacters (ctFont, &ch, &glyph, 1)) { 
    CGRect bounds = CTFontGetBoundingRectsForGlyphs (ctFont, kCTFontOrientationDefault, &glyph, nil, 1); 
    float glyphHeight = bounds.size.height; 
} 

而這裏的上升器/下降代碼:

float adHeight = myLabel.font.ascender-myLabel.font.descender; //Descender is always a negative value 

那麼爲什麼從CTFontGetBoundingRectsForGlyphs返回的字形高度不等於Ascender plus Descender?

+0

你怎麼得到字形高度?也許顯示一些代碼? – hooleyhoop

+0

好的 - 添加了一些代碼... – wayneh

回答

1

字體中的每個字形(字母形狀)都是不同的大小和形狀,對吧?字符'A'的字形高於字符'a'的字形,'t'字形的頂部又不同。

Font.ascender是所有字母形狀(字形)的最大值,Font.descender是最小值。

任何特定的字體都可以很容易地有一個額外的高字形,這意味着Font.ascender值與不包含該字符的字符串的維度沒有關係。

+0

呵呵!因此... GetGlyphs ...函數返回單個字符'&ch'的高度,而'.ascender'或'.descender'是整個Font的最大/最小值。這意味着'T'的字形應該與上部相同,但'a'或'j'不相同。由於沒有一個字符同時滿足上行者的最大高度和下行者的最小高度,因此我無法使字形值與上行者+下行者或字體高度相匹配。 – wayneh

+0

我可以提供一個數組... GetGlyph ...包含「Tj」,它應該返回與上級+下級相同的值......只是一個想法。 – wayneh

+0

yes ascender是最大高度。這不太可能是'T'的頂部 - 字體可能包含圖標,徽標,中文字符等。如果您查看CTFontGetBoundingRectsForGlyphs的定義,那麼它的目的是傳遞一個交替的字形數組並返回ac邊界矩陣 - 所以你的雖然是一個很好的。 – hooleyhoop

相關問題