テキストフロー内にカスタムビューを表示するために使用される UITextView のサブクラスがあります。カスタム ビューの除外パスを追加し、自動レイアウトを使用してその領域内のコンテンツをレンダリングしています。その部分は機能しており、テキストも画像を囲んでいます。課題は、テキストの 2 行目が常に画像の下になるように、カスタムの行間を設定したいということです。私は layoutManager:lineSpacingAfterGlyphAtIndex:withProposedLineFragmentRect: で遊んだことがあり、contentSize と lineHeight に基づく行計算を使用して、文字の行間隔を調整できます。
文字が最初の行にあるかどうかを判断し、lineSpacing を正しく調整できます。問題は、文字が折り返されたときに、最初の文字によって最初の行の文字が再チェックされないことです。2 番目のラップされた文字を入力すると、すべて問題ありません。最初の行には行間隔が追加されます。これにより、2 番目の折り返し文字が入力されたときにレイアウトがジャンプします。
言い換えれば、私がやろうとしていること:
- UITextView 内にカスタム UIView を配置する
- 1 行のテキストに標準の行の高さを設定します。
- 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 を呼び出します。これにより、必要に応じてレンダリングを表示できますが、余分な呼び出しが無効になり、かなり重いように見えます。