美文网首页
文字包裹的实现

文字包裹的实现

作者: js_huh | 来源:发表于2019-11-18 05:47 被阅读0次

    "文字包裹"的实现(是什么? "字符串"整体多大,label就多大)

    1. 设置字体的大小(文字的大小,直接影响"字符串"整体的宽和高
    2. 获取文字真实占用的宽度和高度
    3. 给具体的label赋值
    //设置文本属性 - 大小:17,字体:系统默认
    NSDictionary *nameAttr = @{NSFontAttributeName:[UIFont systemFontOfSize:17]};
    //返回'字符串'的实际宽度和高度
    CGSize nameSize = [self.status.name sizeWithAttributes:nameAttr];
    CGFloat nameW = ceil(nameSize.width);
    CGFloat nameH = ceil(nameSize.height);
    //设置label的frame
    self.nameLabel.frame = CGRectMake(nameX, nameY, nameW, nameH);
    
    方法解读:
     默认情况下,系统文字使用大小:12点, 字体:Helvetica(Neue)
    
    sizeWithAttributes:
        是什么? NSString的方法.
     - (CGSize)sizeWithAttributes:(NSDictionary<NSAttributedStringKey, id> *)attrs;
        作用? 返回,设置了属性的文字占用边框的大小.(就是这段文字真实占用的宽度和高度)
    
     NSAttributedString
        是什么? 就是字符串对象.@interface NSAttributedString : NSObject
        作用? 设置与管理,字符串以及单个字符的相关属性(如: 字体,字间距,颜色的调整)
    
     NSAttributedStringKey
        是什么? 是NSAttributedString的常数(Constants)
                typedef NSString *NSAttributedStringKey;
        作用?   应用于属性字符串(NSAttributedString)的文本属性(Key).
               就是在字典里面,担任Key的位置.
    
     NSFontAttributeName
        是什么? 是'NSAttributedStringKey'里面的一种.专门用来描述文本的字体(UIFont)
        它对应的Value是UIFont对象.
    

    注意:
    sizeWithAttributes方法

    • 它返回的高度是一行的高度.
    • NSString str =@"abcd\nefg";//中间加了\n换行.
    CGSize tempSize = [str sizeWithAttributes: @{NSFontAttributeName:[UIFont systemFontOfSize:17]} ];
    
    tempSize 的长度为 @"abcd"的长度. 
    而非, @"abcdefg"的长度
    

    方法二:
    boundingRectWithSize: options: attributes: context 实现文字包裹

    此方法返回:
      给定选项和显示特征的矩形边框
    参数的含义:
      boundingRectWithSize - 需要绘制的矩形大小
      options - 字符串绘制选项(以什么方式来绘制字符串)
        (如:NSStringDrawingUsesLineFragmentOrigin 指定原点为线段原点,不是基线原点) - (适用于多行文本的使用)
        NSStringDrawingUsesLineFragmentOrigin // 整个文本将以每行组成的矩形为单位计算整个文本的尺寸
      attributes - 应用于字符串的文本属性字典(如:字体
      context - 指定字符串上下文,调整时最小比例因子.
    
    CGSize textSize = CGSizeMake(textW, MAXFLOAT);//文字的高度: MAXFLOAT-无穷
    NSDictionary *textAttr = @{NSFontAttributeName:[UIFont systemFontOfSize:17]};//字体大小 17
    //指定限制,获取实际字符串文本的边界
    CGRect textR = [字符串文本 boundingRectWithSize:textSize options:NSStringDrawingUsesLineFragmentOrigin attributes:textAttr context:nil];
    CGFloat H = textR.size.height;
    self.text控件.frame = CGRectMake(X, Y, W, H);
    

    相关文章

      网友评论

          本文标题:文字包裹的实现

          本文链接:https://www.haomeiwen.com/subject/cxfvictx.html