關(guān)鍵函數(shù)
iOS6以前
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
此函數(shù)已經(jīng)標(biāo)記為廢棄iOS7以后
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context
注意點(diǎn)
這個(gè)問(wèn)題一般在UILabel中遇到,但其實(shí)是NSString的一個(gè)方法。所以在UILabel和UITextView或者UIWebView中都可以使用。
為了獲得一個(gè)CGRect,需要先提供一個(gè)CGSize的參數(shù)。這點(diǎn)是自己一直比較難理解的。基本的思路是寬和高先確定一個(gè),另外一個(gè)給一個(gè)很大很大的數(shù),然后從結(jié)果中得出另外一個(gè)相對(duì)準(zhǔn)確的數(shù)值。比如表格的cell中是一個(gè)內(nèi)容不確定的UILabel,寬度一般是表格的寬度或者干脆是屏幕的寬度,然后就可以利用這個(gè)方法獲得高度。這樣cell的高度就比較容易獲得了。
對(duì)于UILabel,numberOfLines一般要先設(shè)置為0,允許多行文本
font屬性要制定,不過(guò)是在attributes參數(shù)中,這是一個(gè)NSAttributedString的屬性,是一個(gè)字典,具體的要去相應(yīng)的頭文件查看。這也是這個(gè)函數(shù)難用的地方
options參數(shù)一般選第一個(gè)
NSStringDrawingUsesLineFragmentOrigin
context參數(shù)一般給nil
得出的size,一般width事先知道,height是我們希望得到的。得到的結(jié)果需要加1,不然,字符就是放不下,出現(xiàn)...。這個(gè)只是實(shí)際遇到,不應(yīng)該這樣,原因不明。
例子代碼
//獲取多行字符串的寬度和高度
UILabel *titleLabel = [[UILabel alloc]init];
titleLabel.font = [UIFont systemFontOfSize:13];
NSString *titleContent = @"獲取 UILabel 寬度和高度測(cè)試獲取 UILabel 寬度和高度測(cè)試獲取 UILabel 寬度和高度測(cè)試獲取 UILabel 寬度和高度測(cè)試獲取 UILabel 寬度和高度測(cè)試獲取 UILabel 寬度和高度測(cè)試獲取 UILabel 寬度和高度測(cè)試";
titleLabel.text = titleContent;
titleLabel.numberOfLines = 0;//多行顯示,計(jì)算高度
titleLabel.textColor = [UIColor lightGrayColor];
CGSize titleSize = [titleContent boundingRectWithSize:CGSizeMake(kScreen_Width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13]} context:nil].size;
titleLabel.size = titleSize;
[self.view addSubview:titleLabel];