IOS CoreText

在iOS中字形的 Ascent 和 Descent 所占的比例分别是86% 和 14% 例如 [UIFont systemFontOfSize:20]这段代码设置字体大小为20 则对应的 Ascent 和 Descent 分别为  ascent = 17.200000   ,    descent = 2.800000。




对于不同的CTRun 可能有不同的Ascent 和 Descent,当这些CTrun在同一行时对于一行即(CTLine) 其中该CTLine 的 Ascent 和 Descent 用CTRun的最大的值来表示,但是对于每一个CTRun 的Ascent 和 Descent 还是原来的值,并不会改变




CTTypesetterSuggestLineBreak         函数动态的计算每一行里的字数,因为每一行里面的中文字、标点符号、数
字、字母都不一样所以可以显示的字数肯定也是不同的,所以需要作这样的计算。


CFArrayRef lines = CTFrameGetLines(ctFrame); //获得CTFrame 中的CFLine 对象(是一个数组)
CFArrayGetCount(lines) 获得Lines中有多少个元素
CTLineRef line = CFArrayGetValueAtIndex(lines, j);//获得lines 数组中的第J个CTLine


CFArrayRef runs = CTLineGetGlyphRuns(line); //获得一行有多少个CTRun 返回的是一个数组   
CFArrayGetCount(runs) //获得runs 有多少个元素
CTRunRef run = CFArrayGetValueAtIndex(runs, j);//获得Runs 数组中的第J个CTRun

NSDictionary* attributes = (NSDictionary*)CTRunGetAttributes(run);//获得CTRun 中的相关属性,返回值是(CFDictionaryRef)强制转化为NSDictionary对象



CTLineGetTypographicBounds(line, &lineAscent, &lineDescent, &lineLeading);
//计算文字排版上的边界,The typographic width of the line.//返回CTLine宽度,把相关的值赋值到传进来的参数中,参数使用来接受数值的

runRect.size.width = CTRunGetTypographicBounds(run, CFRangeMake(0,0), &runAscent, &runDescent, NULL);
            NSLog(@"width = %f",runRect.size.width);

//计算文字排版上的边界,The typographic width of the run.//返回CTRun宽度,把相关的值赋值到传进来的参数中,参数使用来接受数值的


CFRange range = CTRunGetStringRange(run);//获得在该CTRun中的字符串(包含图片)的在整个CTFrame中的range

如下图所示 该CTFrame 包含3个CTLine
第一个CTLine 包含3个CTRun
对每一个CTRun分别调用该方法
CFRange range = CTRunGetStringRange(run)的到得CFRange 分别是(0,4),(4,1)(5,8)
         


CTFrameGetVisibleStringRange. This function tells you how much text will fit into a given frame








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值