zoukankan      html  css  js  c++  java
  • 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
                        (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));
    }
    这样就可以不仅仅局限于字体和颜色了。

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





  • 相关阅读:
    UVA
    剑指offer 面试题11
    SharePoint 2013+ Sqlserver 2014 Kerberos 配置传奇, 最终的解决方案 验证。
    ASC(1)G(上升时间最长的序列)
    J2EE它是一个框架?平台?规范?
    C++和python使用struct传输二进制数据结构来实现
    前端开发面试题集(二)
    C语言中<CR>是什么意思
    Delphi ParamStr 使用方法
    打包工具 使用帮助 inno setup
  • 原文地址:https://www.cnblogs.com/wanghang/p/6298880.html
Copyright © 2011-2022 走看看