How to get the size of a NSString

ghz 7months ago ⋅ 148 views

A "quicky": how can I get the size (width) of a NSString?

I'm trying to see if the string width of a string to see if it is bigger than a given width of screen, case in which I have to "crop" it and append it with "...", getting the usual behavior of a UILabel. string.length won't do the trick since AAAAAAAA and iiiiii have the same length but different sizes (for example).

I'm kind of stuck.

Answers

To get the width of an NSString in iOS, you can use the sizeWithAttributes: method provided by NSString. This method allows you to measure the size of the string when rendered with specific attributes, such as the font. Here's a quick example to demonstrate how you can get the width of a string:

NSString *string = @"Your string here";
UIFont *font = [UIFont systemFontOfSize:17]; // Use the font you are interested in
NSDictionary *attributes = @{NSFontAttributeName: font};
CGSize size = [string sizeWithAttributes:attributes];
CGFloat stringWidth = size.width;

NSLog(@"String width: %f", stringWidth);

Truncating the String with "..."

If the string's width exceeds a given width, you might want to truncate it and append "...". Here's how you can do that:

  1. Check if the string fits within the given width.
  2. If it doesn't, truncate the string and add "...".

Here’s an example of how you can achieve this:

NSString *string = @"Your long string that might need truncation";
UIFont *font = [UIFont systemFontOfSize:17]; // Use the font you are interested in
CGFloat maxWidth = 200; // The maximum width you want to allow

NSDictionary *attributes = @{NSFontAttributeName: font};
CGSize size = [string sizeWithAttributes:attributes];

if (size.width > maxWidth) {
    // Truncate string and append "..."
    NSMutableString *truncatedString = [string mutableCopy];
    while ([truncatedString sizeWithAttributes:attributes].width > maxWidth && truncatedString.length > 0) {
        [truncatedString deleteCharactersInRange:NSMakeRange(truncatedString.length - 1, 1)];
    }
    [truncatedString appendString:@"..."];
    string = truncatedString;
}

NSLog(@"Truncated string: %@", string);

Using UILabel for Automatic Truncation

If you are displaying the string in a UILabel, you can leverage the label's built-in truncation functionality:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, maxWidth, 20)];
label.font = font;
label.text = string;
label.lineBreakMode = NSLineBreakByTruncatingTail;
[label sizeToFit]; // This will adjust the label's size to fit the text

if (label.frame.size.width > maxWidth) {
    label.frame = CGRectMake(label.frame.origin.x, label.frame.origin.y, maxWidth, label.frame.size.height);
}

Using the UILabel's lineBreakMode property set to NSLineBreakByTruncatingTail ensures that the label will automatically add "..." at the end of the text if it exceeds the width of the label.

Summary

  • Use sizeWithAttributes: to measure the width of an NSString.
  • Truncate the string manually if it exceeds the desired width.
  • Alternatively, use a UILabel with NSLineBreakByTruncatingTail for automatic truncation with "..." appended.