boundingRectWithSize:不尊重lineBreakMode设置

时间:2014-10-13 12:22:06

标签: ios nsstring uikit uilabel nsattributedstring

我正在尝试计算字体大小以使文本适合2行(具有可变的字体大小)。

在storyboard标签中有固定的字体大小,自动换行设置为NSLineBreakByWordWrapping

如果第一个单词长于行宽,我的代码不起作用(适用于iOS 8)。

E.g。对于iOS 7.1中的“Verylongline 45”,boundingRectWithSize:将为行计算rect(w:50,h:60):

Verylongl
ine
45

它保持宽度范围,但无论如何都会在第一个单词之后进行自动换行。在iOS 8中,它返回文本的矩形(w:50,h:40):

Verylongl
ine 45

因为或者差异代码来计算可接受的字体大小不起作用。 iOS 8可以在2行中放入更大的字体,忽略换行设置。

此代码是一种类别方法,用于调整标签的字体大小以使其适合2行。适用于iOS 7.1,不适用于iOS 8.0

for (int i = maxSize; i>minSize; i--) {

    UIFont *font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
    NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    [style setLineBreakMode:NSLineBreakByWordWrapping];

    CGRect rect = [self.text boundingRectWithSize:CGSizeMake(self.frame.size.width, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName: font, NSParagraphStyleAttributeName: style} context:nil];

    if (rect.size.height <= self.frame.size.height) {
        self.font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
        break;
    }
}

你知道如何让它在iOS 8中运行吗?

0 个答案:

没有答案