麻烦计算最大标签高度

时间:2014-11-03 08:20:41

标签: ios objective-c

我无法计算一组标签的最大标签高度。我有以下代码:

-(double)calcMaxHeight:(NSDictionary *)fields withFont:(UIFont *)font {
    double maxRowHeigth = 0;
    NSArray *keys = [fields allKeys];
    for(NSString *key in keys) {
        NSDictionary *dic = [fields objectForKey:key];
        UILabel *aux = [[UILabel alloc] init];
        [aux setNumberOfLines:0];
        [aux setText:[dic objectForKey:@"text"]];
        [aux setFont:font];
        [aux setLineBreakMode:NSLineBreakByWordWrapping];
        CGSize maxSize = CGSizeMake([[dic objectForKey:@"value"] doubleValue],MAXFLOAT);
        CGSize auxSize = [aux sizeThatFits:maxSize];

        if(auxSize.height > maxRowHeigth)
            maxRowHeigth = auxSize.height;
    }
    return maxRowHeigth;
}

此代码"工作"。问题是我需要在文本有填充时计算标签大小,因为在drawTextInRect方法中,我添加UIEdgeInsets {3,3,3,3}。

那么,我如何计算用填充计算的UILabel大小?我尝试覆盖sizeThatFits方法,但我还缺少了一些东西:

-(CGSize)sizeThatFits:(CGSize)size {
    NSString *text=self.text;
    double width = size.width - 6;
    CGSize nSize = CGSizeMake(width, size.height);

    CGSize stringSize = [text boundingRectWithSize:nSize
                                           options:NSStringDrawingTruncatesLastVisibleLine |
                                                   NSStringDrawingUsesLineFragmentOrigin
                                        attributes:@{NSFontAttributeName : self.font}
                                           context:nil].size;
    return stringSize;
}

有了这个,当它占据超过1行时,我看不到整个文本。

谢谢。

问候。

1 个答案:

答案 0 :(得分:0)

这将为您提供字符串的高度,因此标签为:

- (CGSize)sizeForString:(NSString *)text font:(UIFont *)font maxHeight:(CGFloat)maxHeight maxWidth:(CGFloat)maxWidth {

    NSDictionary *stringAttributes = @{NSFontAttributeName : font};

    CGSize stringLength = [text boundingRectWithSize:CGSizeMake(maxWidth, maxHeight 
                                             options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin 
                                          attributes:stringAttributes 
                                             context:nil].size;
    return stringLength;
}