關於 Coretext 排版 我在以前的記錄中提到過,基礎使用不說了,簡單說下關於角標問題,在排版中,遇到方程式相似的,就要實現角標渲染;html
目標效果:字體
對於角標的設置,不少文章說是經過添加如下屬性實現spa
///上標 dic[(id)kCTSuperscriptAttributeName] = [NSNumber numberWithInteger:1]; ///下標 dic[(id)kCTSuperscriptAttributeName] = [NSNumber numberWithInteger:-1];
可是試了幾回,依舊不行,而後研究了關於排版字體的一些UIFont屬性code
familyName 字體家族的名字
fontName 字體的名字
pointSize 字體大小
ascender 基準線以上的高度
descender 基準線如下的高度
capHeight 大小的高度
xHeight 小寫x的高度
lineHeight 當前字體下的行高
leading 行間距(通常爲0)
最終經過設置基準線,可實現上下標,通常角標字體大小爲font字體大小的2/3htm
上角標blog
NSString * fontFamily = textFont.familyName;//字體集 UIFont *badgeFont = [UIFont fontWithName:fontFamily size:fontSize * 2 / 3]; CGFloat baselineOffset = textFont.ascender - (fabs(badgeFont.descender) + badgeFont.ascender) / 2-3.0;
CFStringRef badgeFontName = (__bridge CFStringRef)badgeFont.fontName; fontRef = CTFontCreateWithName((CFStringRef)badgeFontName, fontSize * 2 / 3, NULL); ///設置角標屬性 dic[(id)kCTBaselineOffsetAttributeName]= (id)[NSNumber numberWithFloat:baselineOffset];
下角標ip
NSString * fontFamily = textFont.familyName;//字體集 UIFont *badgeFont = [UIFont fontWithName:fontFamily size:fontSize * 2 / 3]; CGFloat baselineOffset = textFont.descender; CFStringRef badgeFontName = (__bridge CFStringRef)badgeFont.fontName; fontRef = CTFontCreateWithName((CFStringRef)badgeFontName, fontSize * 2 / 3, NULL); ///設置角標屬性 dic[(id)kCTBaselineOffsetAttributeName]= (id)[NSNumber numberWithFloat:baselineOffset];