使用時的注意事項:
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context NS_AVAILABLE_IOS(6_0);
參數(shù)
size
寬高限制,用于計算文本繪制時占據(jù)的矩形塊。
The width and height constraints to apply when computing the string’s bounding rectangle.
options
文本繪制時的附加選項。可能取值請參考“NSStringDrawingOptions”。
context
context上下文。包括一些信息,例如如何調(diào)整字間距以及縮放。最終,該對象包含的信息將用于文本繪制。該參數(shù)可為 nil 。
返回值
一個矩形,大小等于文本繪制完將占據(jù)的寬和高。
討論
可以使用該方法計算文本繪制所需的空間。size 參數(shù)是一個constraint ,用于在繪制文本時作為參考。但是,如果繪制完整個文本需要更大的空間,則返回的矩形大小可能比 size 更大。一般,繪制時會采用constraint 提供的寬度,但高度則會根據(jù)需要而定。
特殊情況
為了計算文本塊的大小,該方法采用默認(rèn)基線。
如果 NSStringDrawingUsesLineFragmentOrigin未指定,矩形的高度將被忽略,同時使用單線繪制。(由于一個 bug,在 iOS6 中,寬度會被忽略)
兼容性
1: NSAttributedString 的每個部分都要至少設(shè)置兩個屬性:
NSFontAttributeName
NSForegroundColorAttributeName
2: NSStringDrawingOptions 的值, 在多行的情況下, 至少要有
NSStringDrawingUsesLineFragmentOrigin
NSStringDrawingUsesFontLeading
3: 如果文字中可能會出現(xiàn)emoji表情的話, emoji的高度比文字要高一點點,
我的方便是簡單的在高度基礎(chǔ)上加了兩個像素.
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];
//根據(jù)計算文字的大小
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];
//設(shè)置button的frame
button.frame = CGRectMake(10 + w, h, length + 15 , 30);
//當(dāng)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);//重設(shè)button的frame
}
w = button.frame.size.width + button.frame.origin.x;
[attributesBGView addSubview:button];
}