web-dev-qa-db-ja.com

iOS 6で指定された幅でNSAttributedStringの高さを計算する方法

可能性のある複製:
固定幅でNSAttributedStringの高さを取得する方法

NSAttributedStringがiOS 6で利用できるようになりました。レイアウトの目的で、固定幅の下でNSAttributedStringの必要な高さを計算する方法を知りたいです。 NSStringの- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)sizeと同等の機能を探していますが、NSAttributedStringを探しています。

NSAttributedStringsの描画サイズを計算するには、2つの方法があります。

  1. - (CGSize)sizeは、幅を考慮しないため使用できません。
  2. - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)contextを試しましたが、どういうわけか正しい高さが得られません。この方法にはバグがあると思います。次のコードを実行すると、bounding size: 572.324951, 19.000000与えられた幅200を無視します。高さ100のようなものを与えるはずです。
 NSMutableAttributedString * attributedString = [[NSMutableAttributedString alloc] init]; 
 NSDictionary * attributes = @ {NSFontAttributeName:[UIFont fontWithName:@ "HelveticaNeue" size:15]、NSForegroundColorAttributeName:[UIColor blueColor]} ; 
 [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@ "Attributed String\n" attributes:attributes]]; 
 [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@ "Attributed String\n "attributes:attributes]]; 
 [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@" Attributed String\n "attributes:attributes]]; 
 [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@ "Attributed String\n" attributes:attributes]]; 
 [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@ "Attributed String\n" attributes:attributes]]; 
 
 C GRect frame = [attributedString boundingRectWithSize:CGSizeMake(200、1000)options:0 context:nil]; 
 NSLog(@ "bounding size:%f、%f"、frame.size.width、frame.size。高さ);

Mac OS Xで利用できる他の方法がありますが、iOSでは利用できません。

60
Jake

オプション2は、適切なパラメーターを使用してiOSで機能します。

NSAttributedString *attrStr = ... // your attributed string
CGFloat width = 300; // whatever your desired width is
CGRect rect = [attrStr boundingRectWithSize:CGSizeMake(width, 10000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];

optionsパラメーターの適切な値がないと、間違った高さになります。

attrStrにはフォント属性が含まれていることも必要です。フォントがなければ、サイズを適切に計算する方法はありません。

167
rmaddy