長い調査の結果、
- boundingRectWithSize
関数は連続した文字列に対してのみ正しいサイズを返します! 文字列にスペースなどが含まれている場合 (Apple では「グリフの一部」と呼ばれています)、テキストを表示するために必要な rect の実際のサイズを取得することはできません!
文字列のスペースを文字に置き換えたところ、すぐに正しい結果が得られました。
Apple はここで言う:
https://developer.apple.com/documentation/foundation/nsstring/1524729-boundingrectwithsize
「このメソッドは、文字列内のグリフの実際の境界を返します。一部のグリフ (スペースなど) は、渡されたサイズによって指定されたレイアウト制約とオーバーラップすることが許可されているため、場合によっては、サイズ コンポーネントの幅の値返さCGRect
れる値は、サイズ パラメータの幅の値を超えることができます。」
したがって、実際の四角形を計算する別の方法を見つける必要があります...
長い調査プロセスの末、ついに解決策が見つかりました!!! に関連するすべてのケースでうまく機能するかどうかはわかりませんUITextView
が、主要かつ重要なことが検出されました!
boundingRectWithSize
関数とCTFramesetterSuggestFrameSizeWithConstraints
(および他の多くのメソッド) は、正しい四角形が使用されている場合、サイズとテキスト部分を正しく計算します。たとえば、 -has- でUITextView
ありtextView.bounds.size.width
、この値は、テキスト描画時にシステムによって使用される実際の四角形ではありませんUITextView
。
非常に興味深いパラメーターを見つけ、コードで簡単な計算を実行しました。
CGFloat padding = textView.textContainer.lineFragmentPadding;
CGFloat actualPageWidth = textView.bounds.size.width - padding * 2;
そして魔法が効きます - すべてのテキストが正しく計算されるようになりました! 楽しみ!