怎么让boundingRectWithSize为NSAttributedString返回错误的大小?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我正在尝试获取属性字符串的ract,但boundingRectWithSize调用不考虑我传入的大小,并且正在返回一个单一行高而不是较大高度(它是一个长字符串)的ract。我试着通过传递一个非常大的值作为高度,并且在下面的代码中也是0,但是返回的矩形总是相同的。

CGRect paragraphRect = [attributedText boundingRectWithSize:CGSizeMake(300,0.0)
  options:NSStringDrawingUsesDeviceMetrics
  context:nil];

提问于
用户回答回答于

看起来你没有提供。为了包装标签,至少要提供:

CGRect paragraphRect =
  [attributedText boundingRectWithSize:CGSizeMake(300.f, CGFLOAT_MAX)
  options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
  context:nil];

如果原始文本的宽度小于300.f,则不会换行,因此请确保绑定的大小是正确的,否则您仍然会得到错误的结果。

用户回答回答于

该方法似乎有许多方面的错误。就像你注意到的那样,它不考虑宽度限制。另一方面,我看到它崩溃,因为它似乎假定所有属性都是NSObject类型的(例如,它试图传递_isDefaultFace给a CTFontRef)。当提供字符串绘图上下文时,它也会崩溃,因为它试图在后台添加一个无值属性给可变属性字符串。

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attrString);
CGSize targetSize = CGSizeMake(320, CGFLOAT_MAX);
CGSize fitSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, [attrString length]), NULL, targetSize, NULL);
CFRelease(framesetter);

扫码关注云+社区