web-dev-qa-db-ja.com

NSStringの幅を取得する方法は?

NSStringの幅を取得しようとしています(例:NSString * myString = @ "hello")。これを行う方法はありますか?

ありがとう。

32
David

これは比較的単純なアプローチです。適切なフォントでNSAttributedStringを作成し、そのサイズを尋ねるだけです。

- (CGFloat)widthOfString:(NSString *)string withFont:(NSFont *)font {
     NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
     return [[[NSAttributedString alloc] initWithString:string attributes:attributes] size].width;
 }
59
Stephen Poletto
UIFont * font = [UIFont systemFontOfSize:15];

CGSize stringSize = [aString sizeWithFont:font]; 

CGFloat width = stringSize.width;
14
joker

UILabelの属性付き文字列を使用する:

- (CGSize)getStringSizeWithText:(NSString *)string font:(UIFont *)font{

    UILabel *label = [[UILabel alloc] init];
    label.text = string;
    label.font = font;

    return label.attributedText.size;
}
3
Amr Lotfy

文字列をsizeWithAttributes:メッセージを送信し、文字列を測定する属性を含む辞書を渡します。

3
Peter Hosey

これをココアタッチで使用するかどうかはわかりません。もしそうなら:

- (CGFloat)widthOfString:(NSString *)string withFont:(NSFont *)font {
     NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
     return [[[NSAttributedString alloc] initWithString:string attributes:attributes] size].width;
 }

動作しません。

ココアタッチでは、コアテキストフレームワークを追加してヘッダーをインポートし、次のようにコードを記述する必要があります。

UIFont *font = [UIFont fontWithName:@"HelveticaNeue-BoldItalic" size:DEFAULT_FONT_SIZE];
//    NSLog(@"%@", NSFontAttributeName);
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, (NSString     *)kCTFontAttributeName, nil];

しかし、GEE !!!!!

NSMutableAttributedString *as = [[NSMutableAttributedString alloc] initWithString:self.caption attributes:attributes];
[as size].width;

nSMutableAttributedStringにはこのメソッドのサイズはありません。

最後に、これはうまくいくでしょう

[self.caption sizeWithFont:font].width
3
Bruce Lee

iOS 7以降では、これが正しい方法です。

NSString * buttonTitle = @"demo title";
CGSize stringSize = [buttonTitle sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];
2
Eli

Objective Cブリッジを使用する場合のClozure Common LISPでのStephenのソリューションを次に示します。解決策を探しているときにこの投稿に出くわし、私にとっては問題なく動作するStephenのバージョンを書き直しました。 Clozureを使用している他の人はこれが役立つと思うかもしれません:

(defun string-width (str font)
  (let* ((dict (#/dictionaryWithObjectsAndKeys: ns:ns-mutable-dictionary
                font #$NSFontAttributeName
                ccl:+null-ptr+))
         (attr (#/initWithString:attributes: (#/alloc ns:ns-attributed-string)
                (ccl::%make-nsstring str)
                dict))
         (size (#/size attr)))
    (ns:ns-size-width size)))
0
Clayton Stanley

申し訳ありませんが、私の質問は十分に詳細ではなく、私がやろうとしていることとまったく同じではありません。テキストストレージ、レイアウトマネージャー、テキストコンテナーを使用しています。解決策は、レイアウトマネージャーを使用して、四角形を囲む長方形を決定することです。これがコードです。

NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:@"hello"];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
NSTextContainer *textContainer = [[NSTextContainer alloc] init];

[layoutManager addTextContainer:textContainer];
[textContainer release];

[textStorage addLayoutManager:layoutManager];
[layoutManager release];

//Figure out the bounding rectangle
NSRect stringRect = [layoutManager boundingRectForGlyphRange:NSMakeRange(0, [layoutManager numberOfGlyphs]) inTextContainer:textContainer];
0
David

UIKitにはNSStringに素敵な機能が追加されており、sizeWithAttributes:が少し軽くなっています。

CGSize titleSize = [title sizeWithFont:titleFont 
                     constrainedToSize:contentCellSize 
                         lineBreakMode:UILineBreakModeWordWrap];
0
Mullzk