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

1|0引入

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

目标效果:

2|0实现

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

///上标 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];

__EOF__

本文作者K
本文链接https://www.cnblogs.com/wangkejia/p/14258008.html
关于博主:评论和私信尽量在第一时间回复哦~
版权声明:如果您要转载,请注明出处哦~
声援博主:如果觉得文章对您有帮助,点击文章右下角【推荐】一下吧~
posted @   macroK  阅读(771)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示