「クイック」:NSStringのサイズ(幅)を取得するにはどうすればよいですか?
文字列の文字列幅が画面の所定の幅よりも大きいかどうかを確認しようとしていますUILabelの。 AAAAAAAAとiiiiiiは同じ長さですが、サイズが異なるため(たとえば)、string.lengthはトリックを行いません。
私はちょっと立ち往生しています。
どうもありがとう。
これは別のアプローチです。テキストが複数行に折り返されないように、テキストの最小サイズを見つけます。 1行以上に折り返される場合、高さを使用して調べることができます。
次のコードを使用できます。
CGSize maximumSize = CGSizeMake(300, 9999);
NSString *myString = @"This is a long string which wraps";
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize myStringSize = [myString sizeWithFont:myFont
constrainedToSize:maximumSize
lineBreakMode:self.myLabel.lineBreakMode];
300は画面の幅で、余白用のスペースが少しあります。フォントとサイズ、およびIBを使用していない場合はlineBreakMode
を独自の値に置き換える必要があります。
myStringSize
にはheight
が含まれます。これは、高さが1行しかないことを確認できます(同じフォントとサイズを使用)。大きい場合は、テキストを切り取る必要があります。もう一度チェックする前に、文字列に...を追加する必要があることに注意してください(...を追加すると、再び制限を超えてプッシュされる可能性があります)。
このコードをループに入れてテキストを切り取り、正しい高さを再度確認します。
以下の方法を使用します。
Objective-C
- (CGSize)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font {
CGSize size = CGSizeZero;
if (text) {
CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:font } context:nil];
size = CGSizeMake(frame.size.width, frame.size.height + 1);
}
return size;
}
Swift 3.
func findHeight(forText text: String, havingWidth widthValue: CGFloat, andFont font: UIFont) -> CGSize {
var size = CGSizeZero
if text {
var frame = text.boundingRect(withSize: CGSize(width: widthValue, height: CGFLOAT_MAX), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
size = CGSize(width: frame.size.width, height: frame.size.height + 1)
}
return size
}
指定したフォントとサイズでレンダリングされた文字列を測定するには、Core Graphicsを使用する必要があります。ウォークスルーについては、 文字列のピクセル幅の測定 に対する回答を参照してください。
sizeWithFont:constrainedToSize:lineBreakMode
廃止されました。以下のコードスニペットを使用して、
UIFont *font=[UIFont fontWithName:@"Arial" size:16.f];
NSString *name = @"Apple";
CGSize size = [name sizeWithAttributes:@{NSFontAttributeName:font}];