小说网站 搜小说 无限网 烟雨红尘 小说爱好者 免费小说 免费小说网站

iOS中动态计算不同颜色、字体的文字高度

在改项目bug的时候,有一个问题动态计算label的高度,前开发者竟然用字符串长度除以14、16这样的常量来计算是否换行,结果cell的高度问题非常严重。

因为label内容里有部分关键字是要另一种颜色,另一种字体,所以计算起来还是有一些难度的。找了多种解决方案,然后整理后写了一个工具方法来处理。

这其实可以扩展到字体的其他会影响到宽度的属性,因为项目里只考虑字体和颜色,所以先记录下来。

最新的方法是NSString的方法,在iOS 7之后才出现,我用的NSAttributedString方法,它是从iOS 6就有了,所以可以兼容到 iOS6 +。

直接上方法,这个方法可以写到一个工具类里或者给label、textView添加类别:

/**  计算文字的高度(正常字体一种字体和颜色,关键字另一种字体和颜色的情况),所有参数不能为空 */
+ (CGFloat)getHeightWithText:(NSString *)text
                nomalFont:(UIFont *)nomalfont
               nomalColor:(UIColor *)nomalColor
             keyTextArray:(NSArray *)keyTextArray
              keyTextFont:(UIFont *)keyTextFont
             keyTextColor:(UIColor *)keyTextColor
               limitWidth:(CGFloat)width
{
    //1、设置正常文字的字体和颜色
    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:text];
    NSDictionary *nomalAttributes = @{NSFontAttributeName:nomalfont,NSForegroundColorAttributeName:nomalColor};
    [attrStr addAttributes:nomalAttributes range:NSMakeRange(0, attrStr.length)];
    //2、设置关键字的字体和颜色
    for (NSString *keyText in keyTextArray) {
        //2.1、找出关键字的range
        NSRange range = [text rangeOfString:keyText];
        if (range.length > 0) {
            //2.2、设置其颜色和字体
            NSDictionary *keyAttributes = @{NSFontAttributeName:keyTextFont,NSForegroundColorAttributeName:keyTextColor};
            [attrStr addAttributes:keyAttributes range:range];
        }
    }
    
    //3、设置文字宽度以及模式
    CGSize attrStrSize = [attrStr boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;
    //4、得出高度
    return attrStrSize.height;
}
因为参数太多了,然后为了便于扩展,又优化了一点点

/** 计算文字高度 方法二  */
- (void)getHeightWithText:(NSString *)text
               attributes:(NSDictionary *)attributes
             keyTextArray:(NSArray *)keyTextArray
        keyTextAttributes:(NSDictionary *)keyAttributes
                    width:(CGFloat)width
{
    //1、设置正常文字的字体和颜色
    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:text];
    [attrStr addAttributes:attributes range:NSMakeRange(0, attrStr.length)];
    //2、设置关键字的字体和颜色
    for (NSString *keyText in keyTextArray) {
        //2.1、找出关键字的range
        NSRange range = [text rangeOfString:keyText];
        if (range.length > 0) {
            //2.2、设置其颜色和字体
            [attrStr addAttributes:keyAttributes range:range];
        }
    }
    //3、设置文字宽度以及模式
    CGSize attrStrSize = [attrStr boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;
    //4、得出高度
    NSLog(@"attrStrSize:%@",NSStringFromCGSize(attrStrSize));
}
这样就可以不仅仅局限于字体和颜色了。

当然还可以扩展到,不同的关键字有不同的颜色、样式等。记录下思路,把关键字、字体样式等作为一个对象放入数组中。





posted on 2015-03-25 18:26  王小航  阅读(379)  评论(0编辑  收藏  举报

导航