引入
关于 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];