2010-04-19 63 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}];