我有一个 UITextView 的子类,用于在文本流中显示自定义视图。它为自定义视图添加了exclusionPath,并使用自动布局在该区域内呈现它的内容。该部分正在工作,并且文本也环绕在图像周围。挑战在于我想要自定义行距,以便第二行文本始终位于图像下方。我玩过 layoutManager:lineSpacingAfterGlyphAtIndex:withProposedLineFragmentRect: 并且可以使用基于 contentSize 和 lineHeight 的行计算来调整字符的行距。
我可以确定一个字符是否在第一行并正确调整它的 lineSpacing。问题是当一个字符换行时,第一个字符不会导致重新检查第一行的字符。如果我输入第二个包装字符,那么一切都很好;第一行将添加行距。这会导致布局在输入第二个换行字符时跳转。
换句话说,我正在尝试做的事情:
- 将自定义 UIView 放在 UITextView 内
- 为单行文本设置标准行高。
- 如果需要超过 1 行文本,则调整第 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。这确实允许渲染根据需要显示,但确实会导致额外的调用无效并且看起来很重。