您的位置 首页 技术

Core Text在制作的时分碰到行间距问题的原因及处理

实在受不了目前没有一个比较完善的库来解决@人名、链接及表情的混排问题。fork了一下TTTAttributedLabel修改了一下https://github.com/qdvictory/TTTAtt

真实受不了现在没有一个比较完善的库来处理@人名、链接及表情的混排问题。

fork了一下TTTAttributedLabel修正了一下https://github.com/qdvictory/TTTAttributedLabel

pull回去现已被commit了,能够直接检查https://github.com/mattt/TTTAttributedLabel

在解说原因之前,需求先提出几个特点。

CLLine CTLineGetTypographicBounds 取出的 ascent descent leading

UIFont 取出的lineHeight descender ascender leading 特别提一下,descender为负值,ascender为正值

关于相关的特点解说,用一张图来展现

在Core Text中,UIFont及CLLineRef都会有一套自己的间隔数据。问题就出在了CLLine上。

使用CTLineGetTypographicBounds取出的descender、ascender、leading会依据当前行里边含有字符计算出来。当此行中含有emoji或中英文之后,计算出来的数值必定与其它行有收支,呈现行距不一致的问题。

咱们要做的便是要将每行从头对齐。

想象一下CLLine每行都有一条基线,假如让每行都以底对齐,那么便是在CLLine的制作原点减去descent,此刻当前行就为底对齐。

接下来的问题又呈现了,假如仅仅单纯这样操作的话,(由于进行了坐标转化)每行都会下降n像素,肯定会超出label的下规模,所以咱们需求再给他一个下行的间隔,而这个间隔最理想的数值便是font.descender。

因此就有了代码

CGContextSetTextPosition(c, lineOrigin.x, lineOrigin.y-descent-self.font.descender);

由此咱们的意图就达到了,一起也期望今后遇到此问题的人有些参阅。

附2张效果图。

默许情况下

默许情况下

修正之后

修正之后

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/321832.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部