2010-08-07 62 views
26

我想獲得一個NSString的寬度(例如NSString * myString = @「hello」)。有沒有辦法做到這一點?如何獲得NSString的寬度?

謝謝。

+0

可能重複的[如何獲得NSString的大小](http://stackoverflow.com/questions/2669063/how-to-get-the-size-of-a-nsstring) – Jaanus 2010-08-07 08:07:54

+4

不,因爲那問題是關於可可觸摸,而這一個是關於可可。 – 2010-08-07 08:28:08

+0

@彼得霍西優秀的觀察。 – Jaanus 2010-08-08 07:59:39

回答

52

這是一個相對簡單的方法。只需創建具有適當的字體的NSAttributedString,並要求其大小:

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

這泄漏了屬性字符串。 – 2010-08-07 08:28:55

+9

確實 - 我假定垃圾收集環境。 – 2010-08-07 08:35:02

+2

只需在字符串上使用'sizeWithAttributes:'代替:'return [string sizeWithAttributes:attributes] .width;' – jowie 2014-06-26 15:56:44

0

對不起,我的問題不夠詳細,不完全是我想要做的。我正在使用文本存儲,佈局管理器和文本容器。解決方案是使用佈局管理器來確定綁定矩形的矩形。這是代碼。

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

這是一條漫長的道路。如果您通常擁有文本存儲,佈局管理器和文本容器(並且有文本視圖),那麼這很好,但是有幾個更簡短的方法。 – 2010-08-07 08:30:18

+0

不會分配給'NSTextField'所需的字符串,然後調用'sizeToFit'方法 - >然後從'NSTextField'獲取寬度會更好嗎? (我有同樣的問題只是想正確地做到這一點) – ColdSteel 2015-10-06 10:53:34

3

發送字符串sizeWithAttributes:消息,傳遞了含有與要測量的字符串屬性的字典。

0

UIKit中有一個很好的補充的NSString,使得sizeWithAttributes:有點輕:

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

'sizeWithFont'已棄用。 – 2016-11-15 09:03:07

1

這裏的斯蒂芬在Clozure Common Lisp中,解決方案使用Objective C的橋樑時。我在尋找解決方案時遇到了這篇文章,並且我剛剛重寫了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))) 
14
UIFont * font = [UIFont systemFontOfSize:15]; 

CGSize stringSize = [aString sizeWithFont:font]; 

CGFloat width = stringSize.width; 
+5

sizeWithFont現已被棄用。它現在應該看起來像CGSize stringSize = [aString sizeWithAttributes:@ {NSFontAttributeName:font}]; – RasTheDestroyer 2014-09-18 00:26:07

3

我不知道,如果你想在可可觸摸使用此。如果是,那麼:

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

不行。

在可可觸摸,你必須添加coretext框架,並導入頭 和寫你這樣的代碼:

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 
+2

這是很長時間以來最令人困惑的答案。你能發佈一個完整的片段嗎? – chrisallick 2015-07-29 21:52:00

-1

以防萬一你想知道如何檢查標籤尺寸,(如果存在甚至不知道),你應該使用UIFont,而不是NSFont

+1

UIFont適用於iOS,NSFont適用於Mac OS X. – 2015-04-05 06:27:55

2

作爲iOS 7及以上,這是正確的做法:

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

使用UILabel的屬性串:

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

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

    return label.attributedText.size; 
}