【问题标题】:NSAttributedString boundingRectWithSize gives different heights between iOS 6 and iOS 7NSAttributedString boundingRectWithSize 在 iOS 6 和 iOS 7 之间给出了不同的高度
【发布时间】:2013-10-03 13:21:19
【问题描述】:

最近使用 XCode 5 将我的应用程序更新到 iOS 7,发现 boundingRectWithSize 给出了不同的高度(在大小部分)计算属性字符串的边界。

以下行在 iOS 6 和 iOS 7 之间给出了不同的结果:

CGRect rect = [self boundingRectWithSize:CGSizeMake(inWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];

"self" 是一个 NSAttributedString,"inWidth" 是字符串应该适合的最大宽度(以像素为单位)。

我认为这是因为 iOS 7 的字体处理方式与 iOS 6 不同。

谁有一个可行的解决方案来计算两个 iOS 版本上的字符串的高度?

【问题讨论】:

标签: objective-c ios6 ios7 xcode5


【解决方案1】:

我遇到了同样的问题,对我来说,高度上的一个简单的 ceil() 解决了它。 还要确保为您的属性字符串设置正确的属性,例如

@{NSParagraphStyleAttributeName: paragraphStyle, NSFontAttributeName : label.font}

【讨论】:

  • 这也在函数文档中:在 iOS 7 及更高版本中,此方法返回小数大小(在返回的 CGRect 的大小组件中);要使用返回的大小来调整视图大小,您必须使用 ceil 函数将其值提高到最接近的更高整数。但是:在 iOS 6 中,我得到了例如18 和 iOS 7 我得到 16.799999 - 所以 ceil() 给我 17。这只是单行文本,多行文本会变得更糟。
【解决方案2】:

由于我们不能对所有高于 4.3 的 iOS 使用 sizeWithAttributes,我们必须为 7.0 和以前的 iOS 编写条件代码。所以我建议使用给定的解决方案

UILabel *gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
gettingSizeLabel.text = @"YOUR TEXT HERE";
gettingSizeLabel.numberOfLines = 0;
CGSize maximumLabelSize = CGSizeMake(310, 9999); // this width will be as per your requirement

CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];

该选项非常好,并且在所有 iOS 中都可以顺利运行,无需条件代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多