これまでの私のすべての調査は、これを正確に行うことは不可能であることを示しているようです。最初に利用できるオプションは次の 2 つだけでした。
a) CATextLayer のレイアウト マネージャーの使用 - 4.0 の時点で iOS では使用できません
b) sizeWithFont:constrainedToSize:lineBreakMode: を使用し、ここで返されたサイズに従って CATextLayer のフレームを調整します。
オプション (b) は最も単純なアプローチであり、うまくいくはずです。結局、UILabels と完全に連携します。しかし、同じフレーム計算を CATextLayer に適用すると、フレームは常に予想または必要より少し大きくなることが判明しました。
結局のところ、(同じフォントとサイズの) CATextLayers と UILabels の行間隔は異なります。その結果、sizeWithFont (行間隔の計算が UILabels の計算と一致する) は、CATextLayers の予想されるサイズを返しません。
これは、CATextLayer に対して UILabel を使用して同じテキストを出力し、結果を比較することでさらに証明されます。最初の行のテキストは完全に重なっています (同じフォントです) が、CATextLayer の行間隔は UILabel よりも少しだけ短くなっています。(申し訳ありませんが、スクリーンショットには機密データが含まれているため、現在スクリーンショットをアップロードできません。現在、クリーンなスクリーンショットを取得するためのサンプル プロジェクトを作成する時間がありません。後世のために後でアップロードします。時間はあります)
これは奇妙な違いですが、そこで使用する NSAttributedString に適切な属性を指定することで CATextLayer の間隔を調整できると思っていましたが、そうではないようです。CFStringAttributes.h を調べると、行間隔に関連する可能性のある単一の属性が見つかりません。
結論:
そのため、レイヤーをテキストに合わせる必要があるシナリオでは、iOS で CATextLayer を使用することはできないようです。私はこれで正しいですか、それとも何か不足していますか?
PS:
CATextLayer と NSAttributedString を使用したかった理由は、表示される文字列が異なるポイントで異なる色で表示されるためです。いつものように手で文字列を描画することに戻る必要があると思います....もちろん、適切な行の高さを取得するために sizeWithFont からの結果をハッキングするオプションが常にあります。
「コード」タグを少し悪用して、投稿を読みやすくします。
投稿に「CATextLayer」のタグを付けることができません - 驚くべきことに、現時点ではそのようなタグは存在しません。十分な評判のある誰かがこの投稿に遭遇した場合は、それに応じてタグ付けしてください.