我有一个UITextView的子类,用于在文本流中显示自定义视图。它为自定义视图添加了一个exclusionPath,并使用autolayout在该区域内呈现它的内容。那部分是有效的,文本也包围了图像。挑战在于我想要自定义行间距,使得第二行文本始终位于图像下方。我使用layoutManager:lineSpacingAfterGlyphAtIndex:withProposedLineFragmentRect:并且可以使用基于contentSize和lineHeight的行计算来调整字符的行间距。
我可以确定某个字符是否在第一行,并正确调整它的lineSpacing。问题是当角色包裹时,第一个角色不会导致重新检查第一行的角色。如果我输入第二个包裹的角色那么一切都很好;第一行将添加行间距。这会导致在输入第二个包装字符时跳转布局。
换句话说,我正在尝试做什么:
- 将自定义UIView放在UITextView中
- 对于单行文本具有标准行高
- 如果需要多行文本,则调整第1行的lineSpacing以包围图像下的第2行。
很抱歉,如果我的图表很粗糙,但这就是我所看到的:
-------------- First line of text view content
| CustomView | second line of text view content
-------------- third line of text view content
fourth line of text view content
这是我想要的:
-------------- First line of text view content
| CustomView |
--------------
second line of text view content
third line of text view content
fourth line of text view content
我错过了什么吗? contentSize.height是否在角色渲染之后才更新?有没有更好的方法来获得框的高度,或确定文本框是否呈现多行?
更新:我可以确定行数(基于contentSize)是1(应该是2)但字形的rect.origin.y是> 0,然后调用invalidateIntrinsicContentSize。这确实允许渲染显示为需要,但确实导致额外的调用无效并且看起来很重。