Đây là đoạn mã làm việc của tôi:
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:attributeDict];
NSString *headline = [dict objectForKey:@"title"];
UIFont *font = [UIFont boldSystemFontOfSize:18];
CGRect rect = [headline boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
CGFloat height = roundf(rect.size.height +4)
Tôi đã thêm 4px vào chiều cao được tính toán, bởi vì nếu không có 4px này, sẽ thiếu một dòng.
Tôi sử dụng đoạn mã này trong tableView và thêm "height" vào một mảng NSNumbers và tôi nhận được chiều cao ô chính xác cho textLabel mặc định.
Thêm 4 pixel nữa nếu bạn muốn có thêm không gian bên dưới văn bản trong textLabel.
**** CẬP NHẬT ****
Tôi không đồng ý với "lỗi chiều rộng của 40px", tôi gọi là 4px chiều cao bị thiếu, bởi vì 4px là chiều cao mặc định của khoảng cách giữa một chữ cái và giới hạn của một dòng. Bạn có thể kiểm tra nó bằng UILabel, đối với kích thước phông chữ là 16, bạn cần chiều cao UILabel là 20.
Nhưng nếu dòng cuối cùng của bạn không có chữ "g" hoặc bất cứ thứ gì trong đó, thì số đo có thể bị sai 4px chiều cao.
Tôi đã kiểm tra lại nó bằng một phương pháp nhỏ, tôi nhận được chiều cao chính xác là 20,40 hoặc 60 cho nhãn của mình và chiều rộng bên phải nhỏ hơn 300px.
Để hỗ trợ iOS6 và iOS7, bạn có thể sử dụng phương pháp của tôi:
- (CGFloat)heightFromString:(NSString*)text withFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
CGRect rect;
float iosVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (iosVersion >= 7.0) {
rect = [text boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
}
else {
CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
rect = CGRectMake(0, 0, size.width, size.height);
}
NSLog(@"%@: W: %.f, H: %.f", self, rect.size.width, rect.size.height);
return rect.size.height;
}
**** NÂNG CẤP ****
Nhờ ý kiến của bạn, tôi đã nâng cấp chức năng của mình như sau. Vì sizeWithFont không được dùng nữa và bạn sẽ nhận được cảnh báo trong XCode, nên tôi đã thêm mã chẩn đoán-pragma-code để xóa cảnh báo cho lệnh gọi / khối mã cụ thể này.
- (CGFloat)heightFromStringWithFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
CGRect rect;
if ([self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
rect = [self boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
}
else {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
CGSize size = [self sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
rect = CGRectMake(0, 0, size.width, size.height);
#pragma GCC diagnostic pop
}
return ceil(rect.size.height);
}
Ngoài chủ đề 4px: tùy thuộc vào phông chữ và trọng lượng phông chữ bạn sử dụng, phép tính trả về các giá trị chiều cao khác nhau. Trong trường hợp của tôi: HelveticaNeue-Medium với kích thước phông chữ là 16.0 trả về chiều cao dòng là 20.0 cho một dòng nhưng 39.0 cho hai dòng, 78px cho 4 dòng -> thiếu 1px cho mọi dòng - bắt đầu bằng dòng 2 - nhưng bạn muốn để có kích thước phông chữ + không gian dòng 4px cho mỗi dòng, bạn phải lấy kết quả chiều cao.
Hãy ghi nhớ điều đó trong khi viết mã!
Tôi chưa có một chức năng nào cho "sự cố" này nhưng tôi sẽ cập nhật bài đăng này khi tôi hoàn thành.