boundingRectWithSize 的使用 动态根据文字长度布局控件

使用时的注意事项:

  • (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context NS_AVAILABLE_IOS(6_0);

参数
size
宽高限制,用于计算文本绘制时占据的矩形块。
The width and height constraints to apply when computing the string’s bounding rectangle.
options
文本绘制时的附加选项。可能取值请参考“NSStringDrawingOptions”。
context
context上下文。包括一些信息,例如如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为 nil 。
返回值
一个矩形,大小等于文本绘制完将占据的宽和高。
讨论
可以使用该方法计算文本绘制所需的空间。size 参数是一个constraint ,用于在绘制文本时作为参考。但是,如果绘制完整个文本需要更大的空间,则返回的矩形大小可能比 size 更大。一般,绘制时会采用constraint 提供的宽度,但高度则会根据需要而定。
特殊情况
为了计算文本块的大小,该方法采用默认基线。
如果 NSStringDrawingUsesLineFragmentOrigin未指定,矩形的高度将被忽略,同时使用单线绘制。(由于一个 bug,在 iOS6 中,宽度会被忽略)
兼容性

1: NSAttributedString 的每个部分都要至少设置两个属性:

NSFontAttributeName

NSForegroundColorAttributeName

2: NSStringDrawingOptions 的值, 在多行的情况下, 至少要有

NSStringDrawingUsesLineFragmentOrigin

NSStringDrawingUsesFontLeading

3: 如果文字中可能会出现emoji表情的话, emoji的高度比文字要高一点点,

我的方便是简单的在高度基础上加了两个像素.

CGFloat w = 0;//保存前一个button的宽以及前一个button距离屏幕边缘的距离
CGFloat h = 0;//用来控制button距离父视图的高
for (int i = 0; i < _dataSource.count; i++) {
    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.tag = 100 + i;
    button.backgroundColor = [UIColor greenColor];
    button.titleLabel.font = [UIFont jk_systemFontOfPxSize:24];
    [button addTarget:self action:@selector(attrs1BtnClick) forControlEvents:UIControlEventTouchUpInside];
    [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    //根据计算文字的大小
    button.backgroundColor = [UIColor redColor];

//
NSDictionary *attributes = @{NSFontAttributeName:[UIFont systemFontOfSize:12]};
CGFloat length = [_dataSource[i] boundingRectWithSize:CGSizeMake(JKScreenWidth, 2000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size.width;

// CGFloat length = [_dataSource[i] calculateTextWidthWithFontSize:12];

    //为button赋值
    [button setTitle:_dataSource[i] forState:UIControlStateNormal];
    //设置button的frame
    button.frame = CGRectMake(10 + w, h, length + 15 , 30);
    //当button的位置超出屏幕边缘时换行 320 只是button所在父视图的宽度
    if( 0 + w + length + 15 > JKScreenWidth - 80){
        w = 0; //换行时将w置为0
        h = h + button.frame.size.height + 10;//距离父视图也变化
        button.frame = CGRectMake(10 + w, h, length + 15, 30);//重设button的frame
    }
    w = button.frame.size.width + button.frame.origin.x;
    [attributesBGView addSubview:button];
}

你可能感兴趣的:(boundingRectWithSize 的使用 动态根据文字长度布局控件)