iOS-Coretext富文本排版實現上下角標(Badge)

引入

關於 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];
相關文章
相關標籤/搜索