zoukankan      html  css  js  c++  java
  • 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];
  • 相关阅读:
    【转载】深入浅出VA函数
    oracle数据库怎么创建数据库实例
    2.4 OpenEuler中C语言中的函数调用测试(选做)
    OpenEuler 中C与汇编的混合编程(选做)
    程序运行
    改进ls的实现(课下作业)
    学习笔记12
    实验四 Web服务器1socket编程
    实验四 Web服务器2
    学习6
  • 原文地址:https://www.cnblogs.com/wangkejia/p/14258008.html
Copyright © 2011-2022 走看看