How to calculate the height of an NSAttributedString with given width in iOS 6

Possible Duplicate:
How to get height for NSAttributedString at a fixed width

Now NSAttributedString is available in iOS 6. For layout purposes, I want to know how to calculate the required height of an NSAttributedString under fixed width. I'm looking for something that's equivalent to NSString's - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size but for NSAttributedString.

To calculate the drawing size of NSAttributedStrings, there are two methods available:

  • - (CGSize)size can't be used because it does not take any width into consideration.
  • I tried - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context , but somehow it doesn't give me the correct height. I think the method is buggy. If I run the following code, it gives me bounding size: 572.324951, 19.000000 ignoring the given width of 200. It should give me something like 100 of height.
  •     NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init];
        NSDictionary *attributes = @{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue" size:15], NSForegroundColorAttributeName : [UIColor blueColor]};
        [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Attributed Stringn" attributes:attributes]];
        [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Attributed Stringn" attributes:attributes]];
        [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Attributed Stringn" attributes:attributes]];
        [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Attributed Stringn" attributes:attributes]];
        [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Attributed Stringn" attributes:attributes]];
    
        CGRect frame = [attributedString boundingRectWithSize:CGSizeMake(200, 1000) options:0 context:nil];
        NSLog(@"bounding size: %f, %f", frame.size.width, frame.size.height);
    

    There are other methods available for Mac OS X, but not for iOS.


    Option 2 does work in iOS with the proper parameters.

    NSAttributedString *attrStr = ... // your attributed string
    CGFloat width = 300; // whatever your desired width is
    CGRect rect = [attrStr boundingRectWithSize:CGSizeMake(width, 10000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
    

    Without the proper values for the options parameter you will get the wrong height.

    It is also required that attrStr contains a font attribute. Without a font, there is no way to properly calculate the size.

    链接地址: http://www.djcxy.com/p/74264.html

    上一篇: CAShapeLayer上的CAGradientLayer SetMask崩溃应用程序

    下一篇: 如何在iOS 6中计算给定宽度的NSAttributedString的高度