Gần đây tôi đã vật lộn với điều này. Vấn đề của tôi là các giải pháp được đăng ở trên bằng heightForRowAtIndexPath:
phương pháp sẽ hoạt động cho iOS 7.1 trong Trình mô phỏng nhưng sau đó đã hoàn toàn làm hỏng kết quả bằng cách chuyển sang iOS 8.1.
Tôi bắt đầu đọc thêm về các ô tự kích thước (được giới thiệu trong iOS 8, đọc tại đây ). Rõ ràng là việc sử dụng UITableViewAutomaticDimension
sẽ giúp ích trong iOS 8. Tôi đã thử sử dụng kỹ thuật đó và xóa việc sử dụng heightForRowAtIndexPath:
và voila, nó đã hoạt động hoàn hảo trong iOS 8. Nhưng iOS 7 thì không. Tôi phải làm gì đây? Tôi cần heightForRowAtIndexPath:
cho iOS 7 chứ không phải cho iOS 8.
Đây là giải pháp của tôi (được cắt xén vì lợi ích của sự ngắn gọn) mà mượn từ câu trả lời @JosephH đã đăng ở trên:
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.estimatedRowHeight = 50.;
self.tableView.rowHeight = UITableViewAutomaticDimension;
// ...
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
return UITableViewAutomaticDimension;
} else {
NSString *cellIdentifier = [self reuseIdentifierForCellAtIndexPath:indexPath];
static NSMutableDictionary *heightCache;
if (!heightCache)
heightCache = [[NSMutableDictionary alloc] init];
NSNumber *cachedHeight = heightCache[cellIdentifier];
if (cachedHeight)
return cachedHeight.floatValue;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
CGFloat height = cell.bounds.size.height;
heightCache[cellIdentifier] = @(height);
return height;
}
}
- (NSString *)reuseIdentifierForCellAtIndexPath:(NSIndexPath *)indexPath {
NSString * reuseIdentifier;
switch (indexPath.row) {
case 0:
reuseIdentifier = EventTitleCellIdentifier;
break;
case 2:
reuseIdentifier = EventDateTimeCellIdentifier;
break;
case 4:
reuseIdentifier = EventContactsCellIdentifier;
break;
case 6:
reuseIdentifier = EventLocationCellIdentifier;
break;
case 8:
reuseIdentifier = NotesCellIdentifier;
break;
default:
reuseIdentifier = SeparatorCellIdentifier;
break;
}
return reuseIdentifier;
}
HỆ THỐNG Chúng được định nghĩa là:
#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)