2011-08-05 10 views
11

私はNSStringを持っていて、適切なUILabelを作成するためにその高さを知りたいと思います。NSStringの高さを取得する

この

NSString *string = @"this is an example"; 
CGSize size = [string sizeWithFont:[UIFont systemFontOfSize:10.0f] 
          forWidth:353.0 
        lineBreakMode:UILineBreakModeWordWrap]; 
float height = size.height; 

高さは今13.0で行います。 私はこの文字列を使用する場合は

NSString *string = @"this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example "; 

高さは常に13.0である(と幅と353で、それは不可能です)...私が間違って何をやっていますか?

ADD:

size.width; 

作品罰金...そうlineBreakModeが正しくありません...しかし、それは、そうでない場合、それはようなものですか?

+0

あなたは文字列からそのサイズを取っていますあなたが作成したCGSizeではなく、オブジェクトです。それはタイプミスですか? –

+0

しかし 'sizeWithFont:forWidth:lineBreakMode'はNSString(例えばUILabelではありません)を受け取ります...正しいですか...そうではありませんか? – JAA

+0

それはそれを取ることはない、と言うと、それはそれに作用し、あなたにサイズを戻します。だから、 'float height = string.height;'を 'float height = sizeに変更するのであれば。高さ;、私はそれがより理にかなっていると思っています。 –

答えて

21

-sizeWithFont:constrainedToSize:lineBreakMode: 

がためであるのに対し、

– sizeWithFont:forWidth:lineBreakMode: 

は「単一行のテキストのコンピューティング・メトリック」のためであるので、あなたが期待するように動作しません。何をやっている理由は、 "複数のテキスト行のメトリックの計算"。 documentationから:単一行のテキストの

コンピュメトリック

– sizeWithFont: 
– sizeWithFont:forWidth:lineBreakMode: 
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 

コンピューティングメトリックは、複数行のテキストのために

– sizeWithFont:constrainedToSize: 
– sizeWithFont:constrainedToSize:lineBreakMode: 

は、代わりに、例えばを-sizeWithFont:constrainedToSize:lineBreakMode:を使用してみてくださいこれは私が通常何をすべきかです:

CGSize maximumLabelSize = CGSizeMake(353,9999); 

CGSize expectedLabelSize = [string sizeWithFont:label.font       
           constrainedToSize:maximumLabelSize 
            lineBreakMode:label.lineBreakMode]; 

CGRect newFrame = label.frame; 
newFrame.size.height = expectedLabelSize.height; 
label.frame = newFrame; 
+0

申し訳ありませんが、私はここに間違って書いた(今私は正しい)!もちろん、Xcodeでそれは正しかった(そしてログは13.0です) – JAA

+0

はい!それは仕事です!ありがとうございました!!! – JAA

+0

これは、1つのメソッドで実行できるコードの数が多すぎます。そして、私はdownvote、笑を取得します。 –

1

Documentation

によると、このメソッドは、指定された 幅に制約文字列の幅と高さを返します。改行が のどこで発生するかを計算しますが、このメソッドは実際にはテキストをさらに 行に折り返しません。文字列のサイズが指定された幅を超えている場合、このメソッド は、最大幅に一致するまで指定された行の ブレークモードを使用してテキストを切り捨てます(レイアウト目的のみ)。結果として切り捨てられた文字列のサイズ を返します。

使用する必要があります - [NSStringのsizeWithFont:constrainedToSize:lineBreakMode:]。同様の動作を持っていますが、渡されたサイズで高さとしてCGFLOAT_MAXをuuseでき