2010-04-19 57 views
27

「quicky」:如何獲取NSString的大小(寬度)?如何獲得NSString的大小

我想看看如果字符串寬度的字符串,看它是否大於屏幕給定的寬度,在這種情況下,我必須「裁剪」它並將其附加「...」獲得UILabel的通常行爲。由於AAAAAAAA和iiiiii具有相同的長度但不同的大小(例如),string.length不會成功。

我有點卡住了。

非常感謝。

回答

38

這是一種不同的方法。找出文本的最小大小,以便它不會換行到多行。如果它包裝到一行以上,可以使用高度查找。

您可以使用此代碼:

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,你可以檢查你知道只有一行高(使用相同的字體和大小)的高度。如果它更大,則需要剪切文本。請注意,您應該在再次檢查之前將...添加到字符串中(添加...可能會再次超過限制)。

將此代碼放入循環中以剪切文本,然後再次檢查正確的高度。

+0

非常感謝! 你的回答是正確的,在再次檢查尺寸之前附加「...」的技巧是明智的。 – camilo 2010-04-19 17:12:52

+5

對於iOS 7,你應該簽出[這個答案](http://stackoverflow.com/a/18951386/3965) – 2013-12-26 21:09:37

+1

它已被棄用後ios7,你應該使用boundingRectWithSize:.. – 7heaven 2015-01-13 03:41:09

4

您需要使用Core Graphics來測量以指定字體和大小呈現的字符串。請參閱Measuring the pixel width of a string的答案進行演練。

+0

neva的答案做到了。無論如何感謝 。 – camilo 2010-04-19 17:50:33

10

使用下面的方法。

目標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; 
} 

夫特3.0

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 
} 
+0

爲什麼身高+ 1? – 2016-09-27 08:42:08

+0

'size = CGSize(width:ceilf(frame.width),height:ceilf(frame.height))'更好。 – 2016-09-27 08:51:59

+0

問題是如何獲取字符串的寬度。這個答案是如何獲得字符串的高度,如果你已經知道它的寬度...好的信息,但不是問題的答案。我認爲做出這個答案的一個更好的方法是提出正確的問題,然後自己回答,隨後對這個問題提出一個可能的評論,指出你的相關問題。 – mah 2018-02-15 16:04:38

2
sizeWithFont:constrainedToSize:lineBreakMode 

現在已不適用。使用下面的代碼片段,

UIFont *font=[UIFont fontWithName:@"Arial" size:16.f]; 

NSString *name = @"APPLE"; 

CGSize size = [name sizeWithAttributes:@{NSFontAttributeName:font}];