如何在iOS 6中计算给定宽度的NSAttributedString的高度

Jak*_*ake 60 bounding-box nsattributedstring ios

可能重复:
如何以固定宽度获取NSAttributedString的高度

现在,NSAttributedString在iOS 6中可用.出于布局目的,我想知道如何在固定宽度下计算NSAttributedString所需的高度.我正在寻找与NSString相当的东西,- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size但是对于NSAttributedString.

要计算NSAttributedStrings的绘图大小,有两种方法可用:

  1. - (CGSize)size 不能使用,因为它没有考虑任何宽度.
  2. 我试过了- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context,但不知怎的,它没有给我正确的高度.我觉得这个方法很麻烦.如果我运行以下代码,它bounding size: 572.324951, 19.000000会让我忽略200的给定宽度.它应该给我一些像100的高度.
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init];
    NSDictionary *attributes = @{NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue" size:15], NSForegroundColorAttributeName : [UIColor blueColor]};
    [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Attributed String\n" attributes:attributes]];
    [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Attributed String\n" attributes:attributes]];
    [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Attributed String\n" attributes:attributes]];
    [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Attributed String\n" attributes:attributes]];
    [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Attributed String\n" attributes:attributes]];

    CGRect frame = [attributedString boundingRectWithSize:CGSizeMake(200, 1000) options:0 context:nil];
    NSLog(@"bounding size: %f, %f", frame.size.width, frame.size.height);

Mac OS X还有其他可用的方法,但不适用于iOS.

rma*_*ddy 167

选项2在iOS中使用适当的参数.

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];
Run Code Online (Sandbox Code Playgroud)

没有适当的options参数值,您将得到错误的高度.

还需要attrStr包含字体属性.没有字体,就无法正确计算尺寸.

  • @Dogweather根据我的经验,NSAttributedString必须有一个NSFontAttributeName键才能正确调整大小. (34认同)
  • 嗯......不适合我.我似乎只有一半的时间得到了很好的计算. (28认同)
  • 我们可能希望使用`CGFLOAT_MAX`作为size参数,而不是`10000`,在某些时候,它可能实际上适合我们的屏幕...... (27认同)
  • 最后,这是一种简单而实用的方法来计算"NSAttributedString"的大小,即使格式非常复杂也可以使用.类似问题的其他答案就像在NSAttributedString上创建一个类别一样 - 谢天谢地,它不一定非常难. (2认同)
  • @bentford感谢您的提示 - 我使用-initWithString:方法创建了一个属性字符串,这导致了完全任意的计算大小.使用-initWithString:attributes:有效! (2认同)