iOS-Coretext富文本排版实现上下角标(Badge)

引入

关于 Coretext 排版 我在之前的记录中提到过,基础使用不说了,简单说下关于角标问题,在排版中,遇到方程式类似的,就要实现角标渲染;

目标效果:

实现

 对于角标的设置,很多文章说是通过添加以下属性实现

///上标
dic[(id)kCTSuperscriptAttributeName] = [NSNumber numberWithInteger:1];

///下标
dic[(id)kCTSuperscriptAttributeName] = [NSNumber numberWithInteger:-1];

但是试了几次,依旧不行,然后研究了关于排版字体的一些UIFont属性

familyName  字体家族的名字
fontName    字体的名字
pointSize   字体大小
ascender    基准线以上的高度
descender   基准线以下的高度
capHeight   大小的高度
xHeight     小写x的高度
lineHeight  当前字体下的行高
leading     行间距(一般为0)

最终通过设置基准线(iOS 11 以后),可实现上下标,一般角标字体大小为font字体大小的2/3

上角标

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];

下角标

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];
原文地址:https://www.cnblogs.com/wangkejia/p/14258008.html