真实受不了现在没有一个比较完善的库来处理@人名、链接及表情的混排问题。
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张效果图。
默许情况下
修正之后