2

私のアプリでは、テキストの内容に応じてビューのサイズを動的に変更する必要があります。最初に-sizeWithFont弦の測定を行います。私のアプリでは多くの測定を行う必要があるため-sizeWithFont、Apple のドキュメントに「iOS 10.4 以降では、このクラス拡張で説明されているメソッドをアプリのセカンダリ スレッドからだけでなく、メインスレッド。ただし、実際には、このメソッドはスレッドセーフではない WebCore 関数を呼び出すため、アプリがクラッシュします。このバグはすでに報告されていますが、まだ修正されていません。(これに関するいくつかの質問、たとえば、マルチスレッド クラッシュの sizeWithFont! )

パフォーマンスのために測定をメインスレッドに入れることができないため、CoreText フレームワークを試しています。最初NSAttributedStringに文字列に対応するものを作成し、次に CT 関数を使用して測定を行います。iOS 6 には、この作業を行うことができるような非常に単純な API があることは知っています-sizeが、互換性のために使用できません。CTFramesetterSuggestFrameSizeWithConstraints()そのため、 orのような低レベル関数を呼び出す必要がありますCTFramesetterCreateFrame()が、これらのCT メソッドが私の制約を尊重しないことがあることがわかりました。たとえば、 に を設定した場合CGSize(200, CGFLOAT_MAX)CTFramesetterSuggestFrameSizeWithConstraints()これは幅に制約があることを意味するはずですが、実際には 205のような幅の広いサイズが返されCTFramesetterCreateFrame()ます。私がそれを呼び出してから呼び出すとCTFrameGetLines()、一部の行の幅が200pxを超えており、本来よりも多くの単語が含まれているため、行数が本来よりも少なくなることがあります。

長い説明で申し訳ありませんが、ここに私の質問があります:

  1. CTフレームワークを使用して単純な文字列を測定するのはもったいないので、 -sizeWithFont をバックグラウンドで安全に使用できるようにする方法はありますか?
  2. の動作がCTFramesetterSuggestFrameSizeWithConstraints()設計によるものである場合、CT 関数を私の制約に厳密に従うようにする方法はありますか? そうでない場合、固定幅の文字列を測定するにはどうすればよいですか?改行モードはワードラップです?
4

1 に答える 1

0

CTFramesetterSuggestFrameSizeWithConstraints() を使用し、結果のサイズを返す前に、result.width パラメータを制約サイズの幅に設定してみてください。

于 2013-01-10T11:30:26.200 に答える