12

NSAttributedString を 3 行表示したい。幅と行数に基づいて、必要な高さを把握する方法はありますか?

そして、計算をバックグラウンドスレッドで実行したいので、サイズ計算を行うために UILabel を作成したくありません。

4

3 に答える 3

6

なぜこれがまだ答えられていないのか不思議です。とにかく、これが私にとって最も速い方法です。

「Height」という名前の NSAttributedString カテゴリを作成します。これにより、「NSAttributedString+Height.{h,m}」というタイトルの 2 つのファイルが生成されます。

.h ファイル内:

@interface NSAttributedString (Height)  
-(CGFloat)heightForWidth:(CGFloat)width;  
@end  

.m ファイル内:

-(CGFloat)heightForWidth:(CGFloat)width  
{  
    return ceilf(CGRectGetHeight([self boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)
                                                    options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading
                                                    context:nil])) + 1;  
}

何が起こっているかは次のとおりです。

  1. boundRectWithSize:options:context get は、メソッドに渡す幅に制限された四角形です。NSStringDrawingUsesLineFragmentOrigin オプションは、複数行の文字列を期待するように指示します。
  2. 次に、その rect から高さパラメーターを取得します。
  3. iOS 7 では、このメソッドは小数を返します。丸い形が必要です。ceilf はそれを助けます。
  4. 戻り値に単位を追加します。

使い方はこちら

NSAttributedString *string = ...
CGFloat height = [string heightForWidth:320.0f];

その高さをレイアウト計算に使用できます。

于 2013-12-10T10:26:08.110 に答える