我只是将文本高度计算函数包装为NSString
的类别。
在.h
文件:
@interface NSString (Additions)
- (CGSize)sizeWithFont:(UIFont *)font;
- (CGSize)sizeWithFontSize:(float)fSize constrainedToSize:(CGSize)cSize;
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)cSize;
@end
在.m
文件:
#import "NSString+Additions.h"
#define kSystemVersion ([[UIDevice currentDevice] systemVersion].intValue)
@implementation NSString (Additions)
- (CGSize)sizeWithFont:(UIFont *)font
{
return [self sizeWithFont:font constrainedToSize:(CGSize)
{MAXFLOAT, MAXFLOAT}];
}
- (CGSize)sizeWithFontSize:(float)fSize constrainedToSize:(CGSize)cSize
{
UIFont *font = [UIFont systemFontOfSize:fSize];
return [self sizeWithFont:font constrainedToSize:cSize];
}
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)cSize
{
if (kSystemVersion < 7)
{
CGSize size = [self sizeWithFont:font constrainedToSize:cSize
lineBreakMode:NSLineBreakByWordWrapping];
return size;
}
else
{
NSDictionary *stringAttributes = @{NSFontAttributeName:font};
CGRect rect = [self boundingRectWithSize:cSize
options:NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingUsesFontLeading
attributes:stringAttributes
context:nil];
return rect.size;
}
}
@end
然后,只需计算你想要的地方字符串的高度。如:
CGSize cSize = (CGSize){THE_LABEL_WIDTH_HERE, MAXFLOAT};
NSString *tmpString = @"Hello there. I'm junkor, and you can call me jun.";
// will use the system font
float height = [tmpString sizeWithFontSize:15 constrainedToSize:cSize].height;
高度是你想要的。有时,当你计算文本的大小,你可以缓存大小为数据实体,如在tableView
的委托功能:当你重新载入数据
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
或滚动tableView
,它总是计算,对高度(或大小)进行缓存。确保每个文本只计算一次,这样会更好。
http://stackoverflow.com/questions/23077829/calculate-tableview-list-cell-height-to-fit-string/23080315#23080315 – Nick