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];
  • 相关阅读:
    C# FileStream 文件复制
    DataSnap Server 客户端调用 异常
    抛出异常 exception
    RAD Tokyo 10.2.2
    delphi ios info.plist
    sql 日期格式
    sql server 2014登录账号
    sql server导入excel数据
    dev16 cxgrid 在DLL里报0地址错
    sql server 查看所有表记录数
  • 原文地址:https://www.cnblogs.com/wangkejia/p/14258008.html
Copyright © 2011-2022 走看看